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
  1. 143     public void bind(ListView listView) {  
  2. 144         listView.setOnItemClickListener(this);  
  3. 145         listView.setAdapter(getRootAdapter());  
  4. 146   
  5. 147         onAttachedToActivity();  
  6. 148     }  
KitKat以前では、ListViewにHeader、Footerを追加するメソッドはsetAdapter()より前に呼ばなければいけない。
そのため、PreferenceFragmentを継承したクラスでListViewにHeader、Footerを追加するタイミングは、super.onActivityCreated()より以前でなければならない。
  1. public class SettingFragment extends PreferenceFragment {  
  2.   
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.         addPreferencesFromResource(R.xml.prefs);  
  7.     }  
  8.   
  9.     @Override  
  10.     public void onViewCreated(View view, Bundle savedInstanceState) {  
  11.         super.onViewCreated(view, savedInstanceState);  
  12.   
  13.         TextView header = new TextView(getActivity());  
  14.         header.setText("Header");  
  15.   
  16.         ListView listView = (ListView) view.findViewById(android.R.id.list);  
  17.         listView.addHeaderView(header);  
  18.     }  
  19.   
  20.     @Override  
  21.     public void onActivityCreated(Bundle savedInstanceState) {  
  22.         super.onActivityCreated(savedInstanceState);  
  23.     }  
  24. }  




*ちなみに、onActivityCreated()より後にaddPreferencesFromResource()を呼んだ場合、Handlerを介してそのタイミングでListViewのsetAdapter()が呼ばれる

addPreferencesFromResource()

setPreferenceScreen()

postBindPreferences()

Handler

bindPreferences()

final PreferenceScreen preferenceScreen = getPreferenceScreen();
preferenceScreen.bind(getListView());

listView.setAdapter();



0 件のコメント:

コメントを投稿