Android drawable资源ID冲突?

时间:2011-10-11 09:47:21

标签: android resources android-activity zxing

我已将ZXing 1.7的/ android项目设置为引用的库 通过我的主要Android应用程序项目。作为一个快速测试/概念证明,我 使用了CaptureActivity,方法与此处描述的相同: http://damianflannery.wordpress.com/2011/06/13/integrate-zxing-barcod ......

大多数情况下,事情都很顺利,我可以启动CaptureActivity并接收 启动它的我的活动中的扫描数据。但是,我得到了一些 真的很奇怪的行为,我认为可能与资源ID有关 我的项目和/ android ZXing项目之间存在冲突。这个 我会采取一些解释,请耐心等待......

我使用以下代码启动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>

stange问​​题是这样的:当我把手机放在 lanscape 中时 方向并启动CaptureActivity,我看到了scan_btn_pressed 图像在显示屏上伸展,另一个副本也是如此 拉伸“将条形码放在取景器矩形内 text ...“。这只有在我按住时启动活动时才会发生 手机处于风景方向。

我发现如果我更换

android:drawableTop="@drawable/btn_scan_drawable" 

android:drawableTop="@drawable/scan_btn_pressed"

问题消失了,一切都运行良好,但我想让它与选择器一起工作(并理解问题发生的原因)。怎么可以从我的 活动的UI神秘地出现在另一个活动中?我是Android开发人员的新手,但我一直在谷歌上搜索这个问题整天,我似乎无法找到为什么会发生这种情况,除了对android文档中的资源ID冲突的一些模糊引用。 / p>

注意:我只使用CaptureActivity作为快速原型/概念验证。我将利用ZXIng库实现我自己的活动,用于最终的应用程序。

2 个答案:

答案 0 :(得分:3)

好吧,在使用图书馆项目时,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/

答案 1 :(得分:1)

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