Я знаю, что это более старая должность, но я хотел поделиться быстрым «грязным решением», которое я придумал для моего проекта. Он работает только для 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
.