2016-02-16 4 views
0



Мне нужно внести некоторые изменения в строки, определенные в файле strings.xml, прежде чем отображать их в представлении. Я могу расширить класс ресурсов и переопределить функцию getString(), чтобы вернуть измененную строку.Изменение строковых значений перед отображением в android

public class MyResource extends Resources { 
    public MyResource(AssetManager assets, DisplayMetrics metrics, 
     Configuration config) { 
     super(assets, metrics, config); 
    } 

    @Override 
    public String getString(int id) throws NotFoundException { 
     if(super.getResourceEntryName(id).equals("hello_world")) 
      return super.getString(id) + " **"; //modifying string for hello_world 
     return super.getString(id); 
    } 
} 

и использовать его в приложении, как:

MyResource myres = new MyResource(super.getAssets(), super.getResources().getDisplayMetrics(), super.getResources().getConfiguration()); 
String modStr = myres.getString(R.string.hello_world); // returns the modified string 
textview.setText(modStr); 

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

setContentView(R.layout.activity_main); 

внутри макета activity_main:

<TextView 
    android:id="@+id/helloText" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/hello_world" 
    android:textColor="#ff0000" /> 

Я не хочу, чтобы явно задать текст для каждого вида (как упоминалось выше), и хотел бы добиться этого с макета XML, а также. Существует ли общий метод, чтобы в любом случае вызывались мои переопределенные ресурсы? Или любой другой способ достичь этого?

Заранее спасибо.

+1

Я не думаю, что я был необходимым продлить класс ресурсов ... почему вы так поступили? –

+0

Почему вы не можете просто подстроить текст динамически в своем коде? Как просто вызвать ресурс String, а затем просто добавить к нему все, что вы хотите, прежде чем отображать его. У меня возникли проблемы с пониманием того, почему это не сработает для вас. – NoChinDeluxe

+1

@NoChinDeluxe: у меня будет модифицированный файл strings.xml (возможно, загруженный через сеть), который я буду анализировать и теперь покажут модифицированные переводы для строк, упомянутых в этом файле strings.xml. В этом файле strings.xml будет только измененное подмножество строк. Поскольку я не знаю заранее, какие строки меняются, я не могу обработать его в коде. Это будет полезно для локализованных строк, для которых у меня не было доступных переводов, когда я отправил apk. – Rahul

ответ

1

Вы лучше использовать форматированные строки в ваших ресурсов

<string name="test_string">hello world%s</string> 

Затем вызовите его

getString(R.string.test_string, " **"); 

Ницца, простой и построен в

+0

Возможно, я хочу заменить всю строку, а не просто добавлять символы. Использование форматированных строк не решит проблему. @keith Есть ли способ вызвать getString() при раздувании макета – Rahul

+0

Если вы заменяете всю строку, то в этой точке используйте другой строковый ресурс. Я все еще склоняюсь к строковым ресурсам, чтобы решить вашу проблему, поскольку они лучше всего подходят для отображения текста пользователю в приложении для Android. – keith

+0

Я пытаюсь создать библиотеку, которая изменит текст в приложении Android. Текст, который нужно изменить, не является предопределенным, а строковые ресурсы для этого не существуют при компиляции приложения. Я могу обрабатывать строки, полученные с помощью setText (путем создания класса-оболочки и использования его для установки текста). ** Не могли бы вы предложить, как обрабатывать строки, определенные в файле макета? ** – Rahul

 Смежные вопросы

  • Нет связанных вопросов^_^