Конфликт идентификатора нарисованного ресурса Android? - PullRequest
4 голосов
/ 11 октября 2011

Я настроил проект / android ZXing 1.7 как библиотеку, на которую ссылается мой основной проект приложения для Android.В качестве быстрого теста / подтверждения концепции, я использовал CaptureActivity так же, как описано здесь: http://damianflannery.wordpress.com/2011/06/13/integrate-zxing-barcod...

В основном все работает хорошо, я могу запустить CaptureActivity и получить отсканированныеданные в моей деятельности, которые запустили его.Тем не менее, я получаю довольно странное поведение, которое, я думаю, может быть связано с конфликтом идентификаторов ресурсов между моим проектом и проектом / 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" 

на

android:drawableTop="@drawable/scan_btn_pressed"

Проблема исчезает и все работает отлично, но я хочу, чтобы она работала с селектором (и понимаю, почему проблема возникает).Как нарисованный из пользовательского интерфейса моей деятельности загадочным образом может отображаться в другой деятельности?Я новичок в разработке под Android, но я весь день гуглю и работаю над этой проблемой, и я не могу понять, почему это происходит, если не считать каких-то смутных ссылок на конфликты идентификаторов ресурсов в документах Android.

Примечание. Я использую CaptureActivity только в качестве быстрого прототипа / подтверждения концепции.Я буду реализовывать свою собственную деятельность, используя библиотеку ZXIng для финального приложения.

Ответы [ 2 ]

3 голосов
/ 13 октября 2011

Хорошо, похоже, что платформа Android имеет несколько складок при использовании библиотечных проектов.Я заметил, что класс R моего проекта и класс R проекта библиотеки ZXIng конфликтуют повсюду, например

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;
    ...

Это объясняет, как элемент пользовательского интерфейса из моей деятельности выбирался действием в проекте библиотеки.Android будет отдавать приоритет идентификаторам ресурсов в основном проекте.

Эта превосходная статья дала решение: 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()) );

Это исправило проблему, хотя мне нужно будет пройти и заменить все прямые ссылки на id с помощью getIndentifier (), чтобы убедиться, что других нет.конфликты.Не идеальное решение.Такое ощущение, что должно быть какое-то довольно простое расширение для инструмента aapt, чтобы гарантировать, что идентификаторы между классами R не конфликтуют.

Для получения дополнительной информации см. Здесь: http://devmaze.wordpress.com/2011/05/22/android-application-android-libraries-and-jar-libraries/

1 голос
/ 11 октября 2011

используйте project->clean.. для регенерации R Класс

...