Android: как обновить sh предпочтительный интерфейс - PullRequest
0 голосов
/ 16 марта 2020

Я делаю PrefreenceFragment, в который добавляю Preferences к PreferenceGroup. У меня есть собственный макет настроек, и в зависимости от некоторых системных трансляций предпочтения должны обновлять свои интерфейсы.

Ниже приведен пример кода:

public static class SettingsFragment extends PreferenceFragmentCompat {
    Activity activity = null;
    String TAG = "SettingsFragment";
    PreferenceCategory category;
    MyPreference mPreference;
    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.root_preferences, rootKey);
    }

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        activity = (Activity) getActivity();
        category = findPreference("MessageKey");
    }

    //called when a system broadcast is received
    public void refreshUI() {
        mPreference.refresh();
    }

    @Override
    public void onResume() {
        super.onResume();
        category = findPreference("MyPreference");
        category.setLayoutResource(R.layout.preference_group_layout);

        MyPreference preference = new MyPreference(getPreferenceScreen().getContext(), category);
        mPreference = preference;
        preference.setKey("P");
        preference.setTitle("i");
        preference.setLayoutResource(R.layout.preference_layout);
        Log.d(TAG, "" + category.addPreference(preference));
    }
}

class MyPreference extends Preference {

    PreferenceGroup mgroup ;
    Context mContext;
    ViewHolder mViewHolder;

    public MyPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        mContext = context;
    }

    public MyPreference(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mContext = context;
    }

    public MyPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
    }

    public MyPreference(Context context, PreferenceGroup category) {
        super(context);
        mContext = context;
        mgroup = category;
    }

    @Override
    public void onBindViewHolder(PreferenceViewHolder holder) {
        Log.d("MyPreference","onBindViewHolder");
        super.onBindViewHolder(holder);
        TextView tv = (TextView)holder.findViewById(R.id.title);
        mViewHolder = new ViewHolder();
        mViewHolder.tv = tv;
        tv.setText("ABCCCCCCCCCCCCCC");
    }

    public void refresh(){
        Log.d("MyPreference","abc called");
        if(mViewHolder == null) {
            Log.d("MyPreference","abc called mViewHolder is null");
            return;
        }
        mViewHolder.tv.setText("PQR");

    }

    private static class ViewHolder{
        TextView tv;
    }

}

Но я заметил, что иногда refresh() называется четным onBindViewHolder() методом, и моя локальная переменная mViewHolder считается нулевой, поскольку я инициализирую его в onBindViewHolder().

Я хочу убедиться, что onBindViewHolder() вызывается раньше refresh() метод и refre sh пользовательский интерфейс при получении системного широковещания.

Я искал по inte rnet об этом, но не получил никакой помощи. Также рекомендуется хранить ссылки на представление Prefrence в классе ViewHolder.

...