Найти разницу между текущей и последней версией?

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

594
задан Peter Mortensen 19 July 2018 в 07:46
поделиться