簡體   English   中英

Android drawable資源ID沖突?

[英]Android drawable resource id conflict?

我已經將ZXing 1.7的/ android項目設置為我的主要Android應用程序項目引用的庫。 作為快速測試/概念驗證,我使用了CaptureActivity,其方式與此處描述的相同: http//damianflannery.wordpress.com/2011/06/13/integrate-zxing-barcod ...

事實上,事情運作良好,我可以啟動CaptureActivity並在啟動它的活動中接收掃描數據。 但是,我得到了一些非常奇怪的行為,我認為這可能與我的項目和/ android ZXing項目之間的資源ID沖突有關。 這需要一些解釋所以請耐心等待......

我使用以下代碼啟動CaptureActivity:

Button scanBtn = (Button)findViewById(R.id.mainmenu_btn_scan); 
scanBtn.setOnClickListener( 
    new View.OnClickListener() 
{ 
    public void onClick(View v) 
    { 
        Intent i = new Intent("com.google.zxing.client.android.SCAN"); 
        i.putExtra("SCAN_MODE", "QR_CODE_MODE"); 
        startActivityForResult(i, SCAN_CODE); 
    } 
}); 

mainmenu_btn_scan在menu.xml中定義:

<LinearLayout android:id="@+id/mainmenu_view" style="@style/MainMenu" xmlns:android="http://schemas.android.com/apk/res/android">
    ...
    <Button android:id="@+id/mainmenu_btn_scan" 
                    android:drawableTop="@drawable/btn_scan_drawable" 
                    style="@style/MainMenuButton" 
                    android:text="Scan"/>
    ... 
</LinearLayout> 

btn_scan_drawable.xml在/ drawable中,是一個可繪制的選擇器:

<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="@drawable/scan_btn_pressed" android:state_focused="true" android:state_pressed="true" /> 
    ...
</selector>

困擾的問題是:當我以手勢方向握住手機並啟動CaptureActivity時,我看到scan_btn_pressed圖像在顯示屏上伸展,另一個副本也延伸到“在取景器矩形文本中放置條形碼”。 “。 僅當我以橫向方向握住手機時啟動活動時才會出現這種情況。

我發現如果我更換

android:drawableTop="@drawable/btn_scan_drawable" 

android:drawableTop="@drawable/scan_btn_pressed"

問題消失了,一切都運行良好,但我想讓它與選擇器一起工作(並理解問題發生的原因)。 如何從我的活動的UI神秘地顯示出另一個活動? 我是Android開發的新手,但我一直在谷歌上搜索並整天處理這個問題,我似乎無法找到為什么會發生這種情況,除了對android文檔中的資源ID沖突的一些模糊引用。

注意:我只使用CaptureActivity作為快速原型/概念驗證。 我將利用ZXIng庫為最終應用程序實現自己的活動。

好吧,看起來Android平台在使用庫項目時有一些皺紋。 我注意到我的項目的R類和ZXIng庫項目的R類在各地都存在沖突,例如

public static final class id {
    ...
    public static final int mainmenu_btn_scan=0x7f070028;
    ...

在圖書館項目的R類中:

public static final class id {
    ...
    public static final int share_app_button=0x7f070028;
    ...

這解釋了我的活動中的UI元素是如何被庫項目中的活動拾取的。 Android將優先考慮主項目中的資源ID。

這篇優秀的文章提供了解決方案: http//blog.blackmoonit.com/2010/12/android-sharing-resources-in-eclipse.html

在CaptureActivity(我在庫中調用的活動)中,我替換了

viewfinderView = (ViewfinderView) findViewById(R.id.viewfinder_view);

有了這個

viewfinderView = (ViewfinderView) findViewById(
    getResources().getIdentifier("viewfinder_view", "id", getPackageName()) );

這解決了這個問題,雖然我需要通過getIndentifier()替換所有直接id引用,以確保沒有任何其他沖突。 不是理想的解決方案。 感覺應該對aapt工具進行一些相當直接的擴展,以確保R類之間的ID不會發生沖突。

有關詳細信息,請參閱此處: http//devmaze.wordpress.com/2011/05/22/android-application-android-libraries-and-jar-libraries/

使用project->clean..重新生成R

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM