我已将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库实现我自己的活动,用于最终的应用程序。
答案 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
类