(http://tools.oesf.biz/android-4.4.2_r1.0/xref/frameworks/base/core/java/android/preference/PreferenceFragment.java)
addPreferencesFromResource()
↓
setPreferenceScreen()
onActivityCreated()
↓
bindPreferences()
↓
final PreferenceScreen preferenceScreen = getPreferenceScreen();
preferenceScreen.bind(getListView());
↓
listView.setAdapter();
http://tools.oesf.biz/android-4.4.2_r1.0/xref/frameworks/base/core/java/android/preference/PreferenceScreen.java#143
143 public void bind(ListView listView) {
144 listView.setOnItemClickListener(this);
145 listView.setAdapter(getRootAdapter());
146
147 onAttachedToActivity();
148 }
KitKat以前では、ListViewにHeader、Footerを追加するメソッドはsetAdapter()より前に呼ばなければいけない。そのため、PreferenceFragmentを継承したクラスでListViewにHeader、Footerを追加するタイミングは、super.onActivityCreated()より以前でなければならない。
public class SettingFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
TextView header = new TextView(getActivity());
header.setText("Header");
ListView listView = (ListView) view.findViewById(android.R.id.list);
listView.addHeaderView(header);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
}
*ちなみに、onActivityCreated()より後にaddPreferencesFromResource()を呼んだ場合、Handlerを介してそのタイミングでListViewのsetAdapter()が呼ばれる
addPreferencesFromResource()
↓
setPreferenceScreen()
↓
postBindPreferences()
↓
Handler
↓
bindPreferences()
↓
final PreferenceScreen preferenceScreen = getPreferenceScreen();
preferenceScreen.bind(getListView());
↓
listView.setAdapter();
0 件のコメント:
コメントを投稿