Я знаю, что это более старая статья, но я хотел поделиться быстрым и грязным решением, которое я придумал для моего проекта. Это работает только для TextViews, но может
адаптироваться и к другим виджетам. Обратите внимание, что для этого требуется, чтобы ссылка была заключена в квадратные скобки (например, [@string/foo]
).
public class RefResolvingTextView extends TextView
{
// ...
@Override
public void setText(CharSequence text, BufferType type)
{
final StringBuilder sb = new StringBuilder(text);
final String defPackage = getContext().getApplicationContext().
getPackageName();
int beg;
while((beg = sb.indexOf("[@string/")) != -1)
{
int end = sb.indexOf("]", beg);
String name = sb.substring(beg + 2, end);
int resId = getResources().getIdentifier(name, null, defPackage);
if(resId == 0)
{
throw new IllegalArgumentException(
"Failed to resolve link to @" + name);
}
sb.replace(beg, end + 1, getContext().getString(resId));
}
super.setText(sb, type);
}
}
Недостатком этого подхода является то, что setText()
преобразует CharSequence
в
String
, что является проблемой, если вы передаете такие вещи, как SpannableString
; для меня
проект это не было проблемой, так как я использовал его только для TextViews
, что мне не нужно
чтобы получить доступ от моего Activity
.