Я делаю 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
.