我们把重点放在loadHeadersFromResource方法上,也就是现在推荐的PreferenceActivity放置Headers模式。接下来就来分析分析吧。
public abstract class PreferenceActivity extends ListActivity implements
PreferenceManager.OnPreferenceTreeClickListener,
PreferenceFragment.OnPreferenceStartFragmentCallback {
......
//省略一堆方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//设置基础布局
setContentView(com.android.internal.R.layout.preference_list_content);
//获取一些ContentView里的控件实例
......
//判断是啥模式,左右展示还是单页
boolean hidingHeaders = onIsHidingHeaders();
mSinglePane = hidingHeaders || !onIsMultiPane();
//获取fragment参数(其实是PreferenceActivity中点击Header item重启PreferenceActivity时传递的)
String initialFragment = getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT);
Bundle initialArguments = getIntent().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
int initialTitle = getIntent().getIntExtra(EXTRA_SHOW_FRAGMENT_TITLE, 0);
int initialShortTitle = getIntent().getIntExtra(EXTRA_SHOW_FRAGMENT_SHORT_TITLE, 0);
if (savedInstanceState != null) {
...... //忽略,非重点主线
} else {
if (initialFragment != null && mSinglePane) {
//SinglePane时有参数则替换显示Fragment
switchToHeader(initialFragment, initialArguments);
......
} else {
//核心方法之一!!!!!!!!!!!!
//记得上面基础使用介绍过吗?新的实现重写onBuildHeaders空方法,在其中
//调运loadHeadersFromResource方法加载header list xml文件
onBuildHeaders(mHeaders);
//如果存在header list则走这里(上面onBuildHeaders里会组织生成mHeaders的list结构)
if (mHeaders.size() > 0) {
//header-fragment左右各半屏模式
if (!mSinglePane) {
if (initialFragment == null) {
//设置显示header
Header h = onGetInitialHeader();
switchToHeader(h);
} else {
//设置显示header及fragment
switchToHeader(initialFragment, initialArguments);
}
}
}
}
}
if (initialFragment != null && mSinglePane) {
//当SinglePane加载的是Fragment时隐藏header,显示fragment
findViewById(com.android.internal.R.id.headers).setVisibility(View.GONE);
mPrefsContainer.setVisibility(View.VISIBLE);
......
} else if (mHeaders.size() > 0) {
//重点!!!!!!!!!!!!!!!!!这就是要分析的header的listview的adapter放置地
setListAdapter(new HeaderAdapter(this, mHeaders));
......
} else {
//这就是最原始的供已经不推荐的addPreferencesFromResource方式加载Preference组件了
//具体原理同上PreferenceFragment的加载显示原理了,不再分析
setContentView(com.android.internal.R.layout.preference_list_content_single);
......
}
//其他初始设置
......
}
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/ruanjian/article-49639-8.html