转载请注明出处:http://blog.csdn.net/droyon/article/details/18009373
本文讲述PreferenceActivity中单击事件的处理,重点记述mCurrentHeader以及设置源代码Settings中的mLastHeader、mCurrentHeader、mParentHeader的作用。主要以多屏幕为例。
在PreferenceActivity中,当我们点击Header时,其处理流程分为 单屏幕和双屏幕两套流程。
1、单屏幕(SinglePane)
1.1、点击每一项,执行如下代码.
- public void onHeaderClick(Header header, int position) {
- Log.d(LOG_TAG, "Settings onHeaderClick Header is:"+header.title+",position is:"+position+",mLastHeader is:"+mLastHeader);
- boolean revert = false;
- if (header.id == R.id.account_add) {
- revert = true;
- }
- Log.d(LOG_TAG, "Settings onHeaderClick Header id is:"+header.id+", R.id.account_add is:"+R.id.account_add+",revert is:"+revert);
- super.onHeaderClick(header, position);
- if (revert && mLastHeader != null) {
- highlightHeader((int) mLastHeader.id);
- } else {
- mLastHeader = header;
- }
- }
关于hightlightHeader下面有详细介绍,这里就不介绍了。
主要执行父类的onHeaderClick方法。
1.2、
- public void onHeaderClick(Header header, int position) {
- if (header.fragment != null) {
- if (mSinglePane) {
- int titleRes = header.breadCrumbTitleRes;
- int shortTitleRes = header.breadCrumbShortTitleRes;
- if (titleRes == 0) {
- titleRes = header.titleRes;
- shortTitleRes = 0;
- }
- startWithFragment(header.fragment, header.fragmentArguments, null, 0,
- titleRes, shortTitleRes);
- } else {
- switchToHeader(header);
- }
- } else if (header.intent != null) {
- startActivity(header.intent);
- }
- }
因为mSinglePane为true,故执行startWithFragment。
1.3、
- Intent intent = onBuildStartFragmentIntent(fragmentName, args, titleRes, shortTitleRes);
- if (resultTo == null) {
- startActivity(intent);
- } else {
- resultTo.startActivityForResult(intent, resultRequestCode);
- }
我们看到这里会执行onBuildStartFragmentIntent。
1.4、
- public Intent onBuildStartFragmentIntent(String fragmentName, Bundle args,
- int titleRes, int shortTitleRes) {
- Intent intent = new Intent(Intent.ACTION_MAIN);
- intent.setClass(this, getClass());
- intent.putExtra(EXTRA_SHOW_FRAGMENT, fragmentName);
- intent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, args);
- intent.putExtra(EXTRA_SHOW_FRAGMENT_TITLE, titleRes);
- intent.putExtra(EXTRA_SHOW_FRAGMENT_SHORT_TITLE, shortTitleRes);
- intent.putExtra(EXTRA_NO_HEADERS, true);
- return intent;
- }
这个方法在子类中有重写。
Settings.java
- public Intent onBuildStartFragmentIntent(String fragmentName, Bundle args,
- int titleRes, int shortTitleRes) {
- Intent intent = super.onBuildStartFragmentIntent(fragmentName, args,
- titleRes, shortTitleRes);
- // some fragments want to avoid split actionbar
- if (DataUsageSummary.class.getName().equals(fragmentName) ||
- PowerUsageSummary.class.getName().equals(fragmentName) ||
- AccountSyncSettings.class.getName().equals(fragmentName) ||
- UserDictionarySettings.class.getName().equals(fragmentName)) {
- intent.putExtra(EXTRA_CLEAR_UI_OPTIONS, true);
- }
- intent.setClass(this, SubSettings.class);
- return intent;
- }
这里主要是为intent增加了SubSettings.class,因为Header中的fragment,需要有个Activity依附。
ps://******log信息
01-08 21:55:05.857: D/Hlwang_Settings(25569): Settings onBuildStartFragmentIntent fragmentName is:com.android.settings.wifi.WifiSettings
//*************************
1.5、由1.3可知,这个intent会被startActivity(intent)发送出去。
Intent会被SubSettings接收,由于SubSettings继承自Settigns.java,因此,这个Intent还会被Settings.java执行。
- public class SubSettings extends Settings {
- }
1.6、在Settings.java的onCreate中:
在onCreate中会执行getMeteData以及getIntent。这两个方法共同作用得到了mFragmentClass。然后执行super.onCreate
- private void getMetaData() {
- try {
- ActivityInfo ai = getPackageManager().getActivityInfo(getComponentName(),
- PackageManager.GET_META_DATA);
- if (ai == null || ai.metaData == null) return;
- mTopLevelHeaderId = ai.metaData.getInt(META_DATA_KEY_HEADER_ID);
- mFragmentClass = ai.metaData.getString(META_DATA_KEY_FRAGMENT_CLASS);
- // Check if it has a parent specified and create a Header object
- final int parentHeaderTitleRes = ai.metaData.getInt(META_DATA_KEY_PARENT_TITLE);
- String parentFragmentClass = ai.metaData.getString(META_DATA_KEY_PARENT_FRAGMENT_CLASS);
- if (parentFragmentClass != null) {
- mParentHeader = new Header();
- mParentHeader.fragment = parentFragmentClass;
- if (parentHeaderTitleRes != 0) {
- mParentHeader.title = getResources().getString(parentHeaderTitleRes);
- }
- }
- } catch (NameNotFoundException nnfe) {
- // No recovery
- }
- }
- public Intent getIntent() {
- Intent superIntent = super.getIntent();
- String startingFragment = getStartingFragmentClass(superIntent);
- // This is called from super.onCreate, isMultiPane() is not yet reliable
- // Do not use onIsHidingHeaders either, which relies itself on this method
- if (startingFragment != null && !onIsMultiPane()) {
- Intent modIntent = new Intent(superIntent);
- modIntent.putExtra(EXTRA_SHOW_FRAGMENT, startingFragment);
- Bundle args = superIntent.getExtras();
- if (args != null) {
- args = new Bundle(args);
- } else {
- args = new Bundle();
- }
- args.putParcelable("intent", superIntent);
- modIntent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, superIntent.getExtras());
- return modIntent;
- }
- return superIntent;
- }
ps://****log信息
01-08 21:55:05.897: D/Hlwang_Settings(25569): Settings getStartingFragmentClass intentClass is:com.android.settings.SubSettingsgetClassName is:com.android.settings.SubSettings
//***********
PreferenceActivity.java
- 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);
这样initialFragment得到了初始化,并且。
- if (initialFragment != null && mSinglePane) {
- // If we are just showing a fragment, we want to run in
- // new fragment mode, but don't need to compute and show
- // the headers.
- switchToHeader(initialFragment, initialArguments);
- if (initialTitle != 0) {
- CharSequence initialTitleStr = getText(initialTitle);
- CharSequence initialShortTitleStr = initialShortTitle != 0
- ? getText(initialShortTitle) : null;
- showBreadCrumbs(initialTitleStr, initialShortTitleStr);
- }
- }
这里跳用switchToHeader将Fragment切换到右边窗体中。
- if (initialFragment != null && mSinglePane) {
- // Single pane, showing just a prefs fragment.
- findViewById(com.android.internal.R.id.headers).setVisibility(View.GONE);
- mPrefsContainer.setVisibility(View.VISIBLE);
- if (initialTitle != 0) {
- CharSequence initialTitleStr = getText(initialTitle);
- CharSequence initialShortTitleStr = initialShortTitle != 0
- ? getText(initialShortTitle) : null;
- showBreadCrumbs(initialTitleStr, initialShortTitleStr);
- }
- }
这里,将左边窗体的Header 列表隐藏。
2、双屏幕(平板)
2.1、首先执行单击事件
- public void onHeaderClick(Header header, int position) {
- if (header.fragment != null) {
- if (mSinglePane) {
- int titleRes = header.breadCrumbTitleRes;
- int shortTitleRes = header.breadCrumbShortTitleRes;
- if (titleRes == 0) {
- titleRes = header.titleRes;
- shortTitleRes = 0;
- }
- startWithFragment(header.fragment, header.fragmentArguments, null, 0,
- titleRes, shortTitleRes);
- } else {
- switchToHeader(header);
- }
- } else if (header.intent != null) {
- startActivity(header.intent);
- }
- }
我们在这个方法内看到,首先判断fragment以及intent,然后会根据mSinglePane来判断进入那个逻辑里。mSinglePane是单屏幕或者双屏幕,此处为false。
在双屏幕中,此处会执行switchToHeader(header)方法。
2.2、
- if (mCurHeader == header) {
- // This is the header we are currently displaying. Just make sure
- // to pop the stack up to its root state.
- getFragmentManager().popBackStack(BACK_STACK_PREFS,
- FragmentManager.POP_BACK_STACK_INCLUSIVE);
- } else {
- int direction = mHeaders.indexOf(header) - mHeaders.indexOf(mCurHeader);
- switchToHeaderInner(header.fragment, header.fragmentArguments, direction);
- setSelectedHeader(header);
- }
这里首先会判断mCurrentHeader是否为要切换的header。如果mCurrentHeader == header,那么执行:
- getFragmentManager().popBackStack(BACK_STACK_PREFS,
- FragmentManager.POP_BACK_STACK_INCLUSIVE);
否则:
- int direction = mHeaders.indexOf(header) - mHeaders.indexOf(mCurHeader);
- switchToHeaderInner(header.fragment, header.fragmentArguments, direction);
- setSelectedHeader(header);
在这里,direction没有发挥作用。这里应该是判断ListView是向上滚动还是向下滚动。
我们看switchToHeaderInnr方法。
2.3、
- getFragmentManager().popBackStack(BACK_STACK_PREFS,
- FragmentManager.POP_BACK_STACK_INCLUSIVE);
- Fragment f = Fragment.instantiate(this, fragmentName, args);
- FragmentTransaction transaction = getFragmentManager().beginTransaction();
- transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
- transaction.replace(com.android.internal.R.id.prefs, f);
- transaction.commitAllowingStateLoss();
这个方法处理fragment的切换。例如:我们在左边,点击了Bluetooth的设置项,那么其fragment会在右边显示。
2.4,最后执行setSelectedHeader方法。
- void setSelectedHeader(Header header) {
- mCurHeader = header;
- int index = mHeaders.indexOf(header);
- if (index >= 0) {
- getListView().setItemChecked(index, true);
- } else {
- getListView().clearChoices();
- }
- showBreadCrumbs(header);
- }
在这个方法中主要处理ListView的setItemChecked状态。如上图中蓝牙设置项的选中底色。并且设置Breadcrumb(标题)
2.5、
- void showBreadCrumbs(Header header) {
- if (header != null) {
- CharSequence title = header.getBreadCrumbTitle(getResources());
- if (title == null) title = header.getTitle(getResources());
- if (title == null) title = getTitle();
- showBreadCrumbs(title, header.getBreadCrumbShortTitle(getResources()));
- } else {
- showBreadCrumbs(getTitle(), null);
- }
- }
- if (mFragmentBreadCrumbs == null) {
- View crumbs = findViewById(android.R.id.title);
- // For screens with a different kind of title, don't create breadcrumbs.
- try {
- mFragmentBreadCrumbs = (FragmentBreadCrumbs)crumbs;
- } catch (ClassCastException e) {
- return;
- }
- if (mFragmentBreadCrumbs == null) {
- if (title != null) {
- setTitle(title);
- }
- return;
- }
- mFragmentBreadCrumbs.setMaxVisible(2);
- mFragmentBreadCrumbs.setActivity(this);
- }
- mFragmentBreadCrumbs.setTitle(title, shortTitle);
- mFragmentBreadCrumbs.setParentTitle(null, null, null);
//*****************************************************************************************
2.6、在设置应用的源代码中,Settings.java类中。上述的处理存在如下差别。
Settings.java重新了switchHeader方法:
- public void switchToHeader(Header header) {
- if (!mInLocalHeaderSwitch) {
- mCurrentHeader = null;
- mParentHeader = null;
- }
- super.switchToHeader(header);
- }
mInLocalHeaderSwitch在我们点击条目的时候为false,故,Settings.java中定义的mCurrentHeader以及mParentHeader会赋值null。然后执行super.switchToHeader()。
二、外部通过Action进入设置应用的流程。(多屏幕的状态下)
- Intent intent=new Intent();
- // intent.setClassName(this, "c");
- // intent.setAction("android.intent.action.PICK_ACTIVITY");
- intent.setAction("android.settings.WIFI_IP_SETTINGS");
- startActivity(intent);
通过上述代码,会进入如下界面。
启动这个界面会经历如下流程,
首先Settigns.java的onCreate方法。
1、
- protected void onCreate(Bundle savedInstanceState) {
- if (getIntent().getBooleanExtra(EXTRA_CLEAR_UI_OPTIONS, false)) {
- getWindow().setUiOptions(0);
- }
- getMetaData();
- mInLocalHeaderSwitch = true;
- super.onCreate(savedInstanceState);
- mInLocalHeaderSwitch = false;
- if (!onIsHidingHeaders() && onIsMultiPane()) {
- highlightHeader();
- // Force the title so that it doesn't get overridden by a direct launch of
- // a specific settings screen.
- setTitle(R.string.settings_label);
- }
- // Retrieve any saved state
- if (savedInstanceState != null) {
- mCurrentHeader = savedInstanceState.getParcelable(SAVE_KEY_CURRENT_HEADER);
- mParentHeader = savedInstanceState.getParcelable(SAVE_KEY_PARENT_HEADER);
- }
- // If the current header was saved, switch to it
- if (savedInstanceState != null && mCurrentHeader != null) {
- //switchToHeaderLocal(mCurrentHeader);
- showBreadCrumbs(mCurrentHeader.title, null);
- }
- if (mParentHeader != null) {
- setParentTitle(mParentHeader.title, null, new OnClickListener() {
- public void onClick(View v) {
- switchToParent(mParentHeader.fragment);
- }
- });
- }
- // TODO Add support for android.R.id.home in all Setting's onOptionsItemSelected
- // getActionBar().setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP,
- // ActionBar.DISPLAY_HOME_AS_UP);
- }
在这个方法内,首先执行getIntent方法,Settings重新了这个方法。
2、
- public Intent getIntent() {
- Intent superIntent = super.getIntent();
- String startingFragment = getStartingFragmentClass(superIntent);
- // This is called from super.onCreate, isMultiPane() is not yet reliable
- // Do not use onIsHidingHeaders either, which relies itself on this method
- if (startingFragment != null && !onIsMultiPane()) {
- Intent modIntent = new Intent(superIntent);
- modIntent.putExtra(EXTRA_SHOW_FRAGMENT, startingFragment);
- Bundle args = superIntent.getExtras();
- if (args != null) {
- args = new Bundle(args);
- } else {
- args = new Bundle();
- }
- args.putParcelable("intent", superIntent);
- modIntent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS, superIntent.getExtras());
- return modIntent;
- }
- return superIntent;
- }
在这个方法内,会调用getStartingFragmentClass方法。
- protected String getStartingFragmentClass(Intent intent) {
- if (mFragmentClass != null) return mFragmentClass;
- String intentClass = intent.getComponent().getClassName();
- if (intentClass.equals(getClass().getName())) return null;
- if ("com.android.settings.ManageApplications".equals(intentClass)
- || "com.android.settings.RunningServices".equals(intentClass)
- || "com.android.settings.applications.StorageUse".equals(intentClass)) {
- // Old names of manage apps.
- intentClass = com.android.settings.applications.ManageApplications.class.getName();
- }
- return intentClass;
- }
这个方法中,intentClass为:com.android.settings.Settings$AdvancedWifiSettingsActivity
ps://****************************************************************log信息
01-08 21:10:06.737: D/Hlwang_Settings(15602): Settings getStartingFragmentClass mFragmentClass is:null
01-08 21:10:06.737: D/Hlwang_Settings(15602): Settings getStartingFragmentClass intentClass is:com.android.settings.Settings$AdvancedWifiSettingsActivity
//************************************************
3、我们继续看onCreate方法。在往下会执行getMeteData方法。
- private void getMetaData() {
- try {
- ActivityInfo ai = getPackageManager().getActivityInfo(getComponentName(),
- PackageManager.GET_META_DATA);
- if (ai == null || ai.metaData == null) return;
- mTopLevelHeaderId = ai.metaData.getInt(META_DATA_KEY_HEADER_ID);
- mFragmentClass = ai.metaData.getString(META_DATA_KEY_FRAGMENT_CLASS);
- // Check if it has a parent specified and create a Header object
- final int parentHeaderTitleRes = ai.metaData.getInt(META_DATA_KEY_PARENT_TITLE);
- String parentFragmentClass = ai.metaData.getString(META_DATA_KEY_PARENT_FRAGMENT_CLASS);
- if (parentFragmentClass != null) {
- mParentHeader = new Header();
- mParentHeader.fragment = parentFragmentClass;
- if (parentHeaderTitleRes != 0) {
- mParentHeader.title = getResources().getString(parentHeaderTitleRes);
- }
- }
- } catch (NameNotFoundException nnfe) {
- // No recovery
- }
- }
这里,AdvancedWifiSettingsActivity在AndroidManifest.xml中的配置:
- <activity android:name="Settings$AdvancedWifiSettingsActivity"
- android:label="@string/wifi_advanced_settings_label"
- android:configChanges="orientation|keyboardHidden|screenSize"
- android:clearTaskOnLaunch="true">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <action android:name="android.settings.WIFI_IP_SETTINGS" />
- <category android:name="android.intent.category.VOICE_LAUNCH" />
- <category android:name="android.intent.category.DEFAULT" />
- </intent-filter>
- <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.wifi.AdvancedWifiSettings" />
- <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
- android:resource="@id/wifi_settings" />
- <meta-data android:name="com.android.settings.PARENT_FRAGMENT_TITLE"
- android:resource="@string/wifi_settings" />
- <meta-data android:name="com.android.settings.PARENT_FRAGMENT_CLASS"
- android:value="com.android.settings.Settings$WifiSettingsActivity" />
- </activity>
故而:mTopLevelId = @+id/wifi_settigns,mFragmentClass为:com.android.settings.wifi.AdvancedWifiSettings,mParentClass为:com.android.settings.Settings$WifiSettingsActivity
ps://************************log信息
01-08 21:10:06.747: D/Hlwang_Settings(15602): Settings getMetaData
01-08 21:10:06.747: D/Hlwang_Settings(15602): Settings getMetaData mFragmentClass is:com.android.settings.wifi.AdvancedWifiSettings
01-08 21:10:06.747: D/Hlwang_Settings(15602): Settings getMetaData parentFragmentClass is:com.android.settings.Settings$WifiSettingsActivity
//******************************
4、继续onCreate执行,接下来会执行:
- mInLocalHeaderSwitch = true;
- super.onCreate(savedInstanceState);
- mInLocalHeaderSwitch = false;
这里会执行super.onCreate方法。之所以用mInLocalHeaderSwitch包裹,主要是因为super.onCreate方法,会执行到PreferenceActitivity.java中的 :
- if (!mSinglePane) {
- if (initialFragment == null) {
- Header h = onGetInitialHeader();
- switchToHeader(h);
- } else {
- switchToHeader(initialFragment, initialArguments);
- }
- }
Settings.java重写了switchToHeader方法。
- public void switchToHeader(Header header) {
- if (!mInLocalHeaderSwitch) {
- mCurrentHeader = null;
- mParentHeader = null;
- }
- super.switchToHeader(header);
- }
这样mInLocalHeaderSwitch为true,不会清楚mCurrentHeader以及mParentHeader。
最后会执行super.switchToHeader方法,这个方法的执行,会将AdvancedWifiSettings加载到如上图所示的右边的区域内。
Settings.java还重新了onGetInitialHeader方法,这个方法为Header赋了正确的值。
- public Header onGetInitialHeader() {
- String fragmentClass = getStartingFragmentClass(super.getIntent());
- if (fragmentClass != null) {
- Header header = new Header();
- header.fragment = fragmentClass;
- header.title = getTitle();
- header.fragmentArguments = getIntent().getExtras();
- mCurrentHeader = header;
- return header;
- }
- return mFirstHeader;
- }
5、最后一步,给上图左边的部分加上setItemChecked效果。也即是上图中的选中状态底纹。
- if (!onIsHidingHeaders() && onIsMultiPane()) {
- highlightHeader();
- // Force the title so that it doesn't get overridden by a direct launch of
- // a specific settings screen.
- setTitle(R.string.settings_label);
- }
- private void highlightHeader() {
- if (mTopLevelHeaderId != 0) {
- Integer index = mHeaderIndexMap.get(mTopLevelHeaderId);
- if (index != null) {
- getListView().setItemChecked(index, true);
- getListView().smoothScrollToPosition(index);
- }
- }
- }
mTopLevelHeaderId,我们在getMeteData方法中得到。
一、在多屏幕中,mFirstHeader的作用主要是为了正确的切换第一个Header。
mFirstHeader的初始化
- if (mFirstHeader == null &&
- HeaderAdapter.getHeaderType(header) != HeaderAdapter.HEADER_TYPE_CATEGORY) {
- mFirstHeader = header;
- }
如果为空,那么mFirstHeader为最靠前的第一个category。
mFirstHeader的使用:
-
- public Header onGetInitialHeader() {
- String fragmentClass = getStartingFragmentClass(super.getIntent());
- if (fragmentClass != null) {
- Header header = new Header();
- header.fragment = fragmentClass;
- header.title = getTitle();
- header.fragmentArguments = getIntent().getExtras();
- mCurrentHeader = header;
- return header;
- }
- return mFirstHeader;
- }
如果getStarttingFragmentClass为null,那么返回mFirstHeader。
-
- public void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- // If it is not launched from history, then reset to top-level
- if ((intent.getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0
- && mFirstHeader != null && !onIsHidingHeaders() && onIsMultiPane()) {
- switchToHeaderLocal(mFirstHeader);
- }
- }
二、mCurrentHeader的作用,显示当前Header的title。
初始化:
- public Header onGetInitialHeader() {
- String fragmentClass = getStartingFragmentClass(super.getIntent());
- if (fragmentClass != null) {
- Header header = new Header();
- header.fragment = fragmentClass;
- header.title = getTitle();
- header.fragmentArguments = getIntent().getExtras();
- mCurrentHeader = header;
- return header;
- }
- return mFirstHeader;
- }
外部跳转得到了fragmentClass,那么会初始化mCurrentHeader。
另外的一处初始化:
- private void switchToParent(String className) {
- final ComponentName cn = new ComponentName(this, className);
- try {
- final PackageManager pm = getPackageManager();
- final ActivityInfo parentInfo = pm.getActivityInfo(cn, PackageManager.GET_META_DATA);
- if (parentInfo != null && parentInfo.metaData != null) {
- String fragmentClass = parentInfo.metaData.getString(META_DATA_KEY_FRAGMENT_CLASS);
- CharSequence fragmentTitle = parentInfo.loadLabel(pm);
- Header parentHeader = new Header();
- parentHeader.fragment = fragmentClass;
- parentHeader.title = fragmentTitle;
- mCurrentHeader = parentHeader;
- switchToHeaderLocal(parentHeader);
- highlightHeader();
- mParentHeader = new Header();
- mParentHeader.fragment
- = parentInfo.metaData.getString(META_DATA_KEY_PARENT_FRAGMENT_CLASS);
- mParentHeader.title = parentInfo.metaData.getString(META_DATA_KEY_PARENT_TITLE);
- }
- } catch (NameNotFoundException nnfe) {
- Log.w(LOG_TAG, "Could not find parent activity : " + className);
- }
- }
使用:
在onCreate中。
- if (savedInstanceState != null) {
- mCurrentHeader = savedInstanceState.getParcelable(SAVE_KEY_CURRENT_HEADER);
- mParentHeader = savedInstanceState.getParcelable(SAVE_KEY_PARENT_HEADER);
- }
- // If the current header was saved, switch to it
- if (savedInstanceState != null && mCurrentHeader != null) {
- //switchToHeaderLocal(mCurrentHeader);
- showBreadCrumbs(mCurrentHeader.title, null);
- }
三、mParentHeader,
初始化:
- private void getMetaData() {
- try {
- ActivityInfo ai = getPackageManager().getActivityInfo(getComponentName(),
- PackageManager.GET_META_DATA);
- if (ai == null || ai.metaData == null) return;
- mTopLevelHeaderId = ai.metaData.getInt(META_DATA_KEY_HEADER_ID);
- mFragmentClass = ai.metaData.getString(META_DATA_KEY_FRAGMENT_CLASS);
- // Check if it has a parent specified and create a Header object
- final int parentHeaderTitleRes = ai.metaData.getInt(META_DATA_KEY_PARENT_TITLE);
- String parentFragmentClass = ai.metaData.getString(META_DATA_KEY_PARENT_FRAGMENT_CLASS);
- if (parentFragmentClass != null) {
- mParentHeader = new Header();
- mParentHeader.fragment = parentFragmentClass;
- if (parentHeaderTitleRes != 0) {
- mParentHeader.title = getResources().getString(parentHeaderTitleRes);
- }
- }
- } catch (NameNotFoundException nnfe) {
- // No recovery
- }
- }
使用如上面的mCurrentHeader。