2011-10-11 85 views
4

我设置了ZXing 1.7的/ android项目作为我的主android应用程序项目引用的 库。作为概念的快速测试/证明,我 已经使用了CaptureActivity,以同样的方式如下所述: http://damianflannery.wordpress.com/2011/06/13/integrate-zxing-barcod ...Android可绘制资源ID冲突?

大多数情况下,工作的事情好了,我可以启动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是/可绘制的,并且是可绘制的选择器:

<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 图像在整个显示拉长,并且它的另一个副本也 跨越拉伸“内放置一个条形码取景器矩形 文字...“。这只发生在我推出活动的同时拿着 的手机风景的方向。

我发现,如果我有

android:drawableTop="@drawable/scan_btn_pressed" 

问题就没有了,一切都完美的作品,但我想要得到它与选择的工作取代

android:drawableTop="@drawable/btn_scan_drawable" 

(和理解为什么这个问题发生)。如何从我的 活动的用户界面中抽取出一个神奇的东西来显示在另一个活动中?我是Android开发的新手,但我一直在使用Google和Google这方面的工作,似乎无法找到为什么会发生这种情况,除了在Android文档中对资源ID冲突的模糊引用之外。

注意:我正在使用CaptureActivity作为快速原型/验证概念。我将利用Zxxng库实现我自己的最终应用程序。

回答

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/

+0

我认为这是一个漫长的解决方案 - 您也可以确保导入正确的R,或者使用your.package.R.id.viewfinder_view来区分。这更多是Java进口的问题。这也突出了重复使用不意味着被复制的项目的问题,而不是作为图书馆项目。 –

+2

我不这么认为,真正的问题是R类中的ID有冲突。 com.somelib.R.share_app_button == com.myapp.R.mainmenu_btn_scan,正在使用正确的R文件,但由于冲突和Android的资源优先级规则,库的R文件ID最终会引用我应用程序中的资源。 –

+0

@SeanOwen:资源ID冲突发生是因为不同项目中的多个资源被映射到相同的整数ID值。无论您是否使用软件包名称来限定您的Java代码,它们都映射到相同的值。当Android运行时被赋予整数ID值来查找某些内容时,它没有帮助它解决冲突的信息,因此它只能遵循预定义的资源优先级规则,这在很多情况下会导致错误的结果。 – rwong

1

使用project->clean..再生R

+0

我试过这个,不幸的是它没有工作。 –