Заменить (или переопределить) строку в проекте библиотеки Android

Я пытался создать проект библиотеки Android, и хотя процесс сборки работает нормально, у меня возникли проблемы с заменой ресурса в проекте, который использует библиотеку.

В моей библиотеке у меня есть:

  1. library_layout.xml, содержащий

    <TextView  
        android:id="@+id/str_my_string"  
        android:layout_width="wrap_content"  
        android:layout_text="wrap_content">
    
  2. Java-файл, который вызывает

    ((TextView)this.findViewById(R.id.str_my_string)).setText(R.string.my_string);
    
  3. Ресурс strings.xml, содержащий

    <string name="my_string">Placeholder</string>
    

В проекте с использованием библиотеки у меня есть

  1. Ресурс strings.xml, содержащий

    <string name="my_string">Actual string content</string>
    

Ожидаемое поведение заключается в том, что когда я запускаю проект с использованием библиотеки, в текстовом представлении отображается фактическое содержимое строки, но на самом деле оно содержит false.

Глядя в приложение, которое использует библиотеку, я действительно вижу два файла R, и оба они имеют R.string.my_string, и оба они равны одному и тому же числовому значению.


person jwriteclub    schedule 24.11.2010    source источник


Ответы (2)


У меня такая же договоренность, и это работает для меня, как и ожидалось.

В библиотеке есть макет/класс с этой ссылкой на строковый ресурс:

<TextView android:id="@+id/studentSinceLabel">

Библиотека предоставляет значение по умолчанию в файле strings.xml:

<string name="studentSinceLabel">Student Since</string>

Основное приложение имеет это значение в файле strings.xml:

<string name="studentSinceLabel">Client Since</string>

Когда я задаю значение для этого ресурса в файле strings.xml основного приложения, я вижу клиент с тех пор, когда приложение запускается, когда я удаляю его из файла strings.xml основного приложения, я вижу значение из библиотеки, студент с.

Кажется, это ожидаемое поведение, основанное на моем прочтении здесь: http://developer.android.com/tools/sdk/eclipse-adt.html

Соответствующая цитата из ссылки выше:

В тех случаях, когда идентификатор ресурса определен как в приложении, так и в библиотеке, инструменты гарантируют, что ресурс, объявленный в приложении, получит приоритет и что ресурс в проекте библиотеки не будет скомпилирован в приложение .apk. Это дает вашему приложению гибкость для использования или переопределения любого поведения ресурсов или значений, которые определены в любой библиотеке.

person R Miller    schedule 08.12.2010
comment
Так что, похоже, у меня просто были проблемы с тем, что Eclipse не очищал старый хлам. - person jwriteclub; 13.04.2011
comment
Это точно, но произойдет сбой, если строка будет переведена в библиотеке. Переведенная версия в lib переопределяет версию с использованием приложения (переведенную или нет). Итак, урок усвоен: не переводите строку-заполнитель. - person johan d; 18.03.2015
comment
@джоханд. для библиотек, которые используют переведенный строковый ресурс, можно ли переопределить его в нашем проекте? - person Bruce; 03.05.2016
comment
На самом деле я нашел решение для переведенного текста, просто переопределив каждую из переведенных версий. В моем случае у меня есть один и тот же идентификатор ресурса в values/strings.xml и values-en/strings.xml для английского языка, чтобы показать мой переопределенный текст, ура. - person Bruce; 03.05.2016
comment
В моем случае переопределение ресурса по умолчанию не работает. Структура моего проекта более сложная, несколько модулей. У меня есть приложение, которое использует модуль A, который зависит от стороннего модуля B. В модуле A я хочу переопределить любые ресурсы с тем же именем из модуля B. Например, у меня есть определил мой синий цвет, однако то, что я вижу во время выполнения, - это оттенок синего, определенный в модуле B (сторонняя сторона). Никаких переводов. Любая идея о такой установке? - person Stan; 04.07.2016

Просто была эта ошибка, вот что произошло в моем случае:

Если вы используете несколько файлов strings.xml для разных размеров экрана в своей библиотеке, ваше приложение может использовать файл библиотеки.

То есть, если у вас есть:

LIBRARY :  
    res/values/strings.xml  
    res/values-sw600dp/strings.xml

а также :

APP :
    res/values/strings.xml

И вы пытаетесь запустить свое приложение на экране с разрешением 600 dp (например, на планшете), ваше приложение получит strings.xml(sw600dp) из вашей библиотеки.
Чтобы избежать этого, вы можете создать strings.xml относится к sw600dp разрешениям в вашем приложении и содержит те же строковые значения, что и в вашей библиотеке.

person Elynad    schedule 16.06.2020