Android可绘制资源ID冲突?

2023-12-11

我已经将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>

奇怪的问题是:当我将手机放在lanscape方向并启动 CaptureActivity,我看到 scan_btn_pressed 图像在显示屏上拉伸,并且它的另一个副本也 拉伸穿过“将条形码放在取景器矩形内 文本...”。只有当我按住按钮启动活动时才会发生这种情况 电话在景观方向。

我发现如果我更换

android:drawableTop="@drawable/btn_scan_drawable" 

with

android:drawableTop="@drawable/scan_btn_pressed"

问题消失了,一切正常,但我想让它与选择器一起工作(并理解问题发生的原因)。如何从我的 Activity 的 UI 神秘地出现在另一个 Activity 中?我是 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/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android可绘制资源ID冲突? 的相关文章

随机推荐