2014年5月6日火曜日

PreferenceFragmentでHeader, Footerを追加するタイミング

onActivityCreated()より前にaddPreferencesFromResource()を呼んだ場合、onActivityCreated()でListViewのsetAdapter()が呼ばれる。
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 件のコメント:

コメントを投稿