Android(安卓)Settings 系统设置中 PreferenceActivity点击Header是如何处理的?
转载请注明出处:http://blog.csdn.net/droyon/article/details/18009373
本文讲述PreferenceActivity中单击事件的处理,重点记述mCurrentHeader以及设置源代码Settings中的mLastHeader、mCurrentHeader、mParentHeader的作用。主要以多屏幕为例。
在PreferenceActivity中,当我们点击Header时,其处理流程分为 单屏幕和双屏幕两套流程。
1、单屏幕(SinglePane)
1.1、点击每一项,执行如下代码.
[java] view plain copy- publicvoidonHeaderClick(Headerheader,intposition){
- Log.d(LOG_TAG,"SettingsonHeaderClickHeaderis:"+header.title+",positionis:"+position+",mLastHeaderis:"+mLastHeader);
- booleanrevert=false;
- if(header.id==R.id.account_add){
- revert=true;
- }
- Log.d(LOG_TAG,"SettingsonHeaderClickHeaderidis:"+header.id+",R.id.account_addis:"+R.id.account_add+",revertis:"+revert);
- super.onHeaderClick(header,position);
- if(revert&&mLastHeader!=null){
- highlightHeader((int)mLastHeader.id);
- }else{
- mLastHeader=header;
- }
- }
关于hightlightHeader下面有详细介绍,这里就不介绍了。
主要执行父类的onHeaderClick方法。
1.2、
- publicvoidonHeaderClick(Headerheader,intposition){
- if(header.fragment!=null){
- if(mSinglePane){
- inttitleRes=header.breadCrumbTitleRes;
- intshortTitleRes=header.breadCrumbShortTitleRes;
- if(titleRes==0){
- titleRes=header.titleRes;
- shortTitleRes=0;
- }
- startWithFragment(header.fragment,header.fragmentArguments,null,0,
- titleRes,shortTitleRes);
- }else{
- switchToHeader(header);
- }
- }elseif(header.intent!=null){
- startActivity(header.intent);
- }
- }
因为mSinglePane为true,故执行startWithFragment。
1.3、
[java] view plain copy- Intentintent=onBuildStartFragmentIntent(fragmentName,args,titleRes,shortTitleRes);
- if(resultTo==null){
- startActivity(intent);
- }else{
- resultTo.startActivityForResult(intent,resultRequestCode);
- }
我们看到这里会执行onBuildStartFragmentIntent。
1.4、
- publicIntentonBuildStartFragmentIntent(StringfragmentName,Bundleargs,
- inttitleRes,intshortTitleRes){
- Intentintent=newIntent(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);
- returnintent;
- }
这个方法在子类中有重写。
Settings.java
[java] view plain copy- publicIntentonBuildStartFragmentIntent(StringfragmentName,Bundleargs,
- inttitleRes,intshortTitleRes){
- Intentintent=super.onBuildStartFragmentIntent(fragmentName,args,
- titleRes,shortTitleRes);
- //somefragmentswanttoavoidsplitactionbar
- 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);
- returnintent;
- }
这里主要是为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执行。
- publicclassSubSettingsextendsSettings{
- }
1.6、在Settings.java的onCreate中:
在onCreate中会执行getMeteData以及getIntent。这两个方法共同作用得到了mFragmentClass。然后执行super.onCreate
[java] view plain copy- privatevoidgetMetaData(){
- try{
- ActivityInfoai=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);
- //CheckifithasaparentspecifiedandcreateaHeaderobject
- finalintparentHeaderTitleRes=ai.metaData.getInt(META_DATA_KEY_PARENT_TITLE);
- StringparentFragmentClass=ai.metaData.getString(META_DATA_KEY_PARENT_FRAGMENT_CLASS);
- if(parentFragmentClass!=null){
- mParentHeader=newHeader();
- mParentHeader.fragment=parentFragmentClass;
- if(parentHeaderTitleRes!=0){
- mParentHeader.title=getResources().getString(parentHeaderTitleRes);
- }
- }
- }catch(NameNotFoundExceptionnnfe){
- //Norecovery
- }
- }
- publicIntentgetIntent(){
- IntentsuperIntent=super.getIntent();
- StringstartingFragment=getStartingFragmentClass(superIntent);
- //Thisiscalledfromsuper.onCreate,isMultiPane()isnotyetreliable
- //DonotuseonIsHidingHeaderseither,whichreliesitselfonthismethod
- if(startingFragment!=null&&!onIsMultiPane()){
- IntentmodIntent=newIntent(superIntent);
- modIntent.putExtra(EXTRA_SHOW_FRAGMENT,startingFragment);
- Bundleargs=superIntent.getExtras();
- if(args!=null){
- args=newBundle(args);
- }else{
- args=newBundle();
- }
- args.putParcelable("intent",superIntent);
- modIntent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS,superIntent.getExtras());
- returnmodIntent;
- }
- returnsuperIntent;
- }
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
[java] view plain copy- StringinitialFragment=getIntent().getStringExtra(EXTRA_SHOW_FRAGMENT);
- BundleinitialArguments=getIntent().getBundleExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS);
- intinitialTitle=getIntent().getIntExtra(EXTRA_SHOW_FRAGMENT_TITLE,0);
- intinitialShortTitle=getIntent().getIntExtra(EXTRA_SHOW_FRAGMENT_SHORT_TITLE,0);
这样initialFragment得到了初始化,并且。
- if(initialFragment!=null&&mSinglePane){
- //Ifwearejustshowingafragment,wewanttorunin
- //newfragmentmode,butdon'tneedtocomputeandshow
- //theheaders.
- switchToHeader(initialFragment,initialArguments);
- if(initialTitle!=0){
- CharSequenceinitialTitleStr=getText(initialTitle);
- CharSequenceinitialShortTitleStr=initialShortTitle!=0
- ?getText(initialShortTitle):null;
- showBreadCrumbs(initialTitleStr,initialShortTitleStr);
- }
- }
这里跳用switchToHeader将Fragment切换到右边窗体中。
[java] view plain copy- if(initialFragment!=null&&mSinglePane){
- //Singlepane,showingjustaprefsfragment.
- findViewById(com.android.internal.R.id.headers).setVisibility(View.GONE);
- mPrefsContainer.setVisibility(View.VISIBLE);
- if(initialTitle!=0){
- CharSequenceinitialTitleStr=getText(initialTitle);
- CharSequenceinitialShortTitleStr=initialShortTitle!=0
- ?getText(initialShortTitle):null;
- showBreadCrumbs(initialTitleStr,initialShortTitleStr);
- }
- }
这里,将左边窗体的Header 列表隐藏。
2、双屏幕(平板)
2.1、首先执行单击事件
[java] view plain copy- publicvoidonHeaderClick(Headerheader,intposition){
- if(header.fragment!=null){
- if(mSinglePane){
- inttitleRes=header.breadCrumbTitleRes;
- intshortTitleRes=header.breadCrumbShortTitleRes;
- if(titleRes==0){
- titleRes=header.titleRes;
- shortTitleRes=0;
- }
- startWithFragment(header.fragment,header.fragmentArguments,null,0,
- titleRes,shortTitleRes);
- }else{
- switchToHeader(header);
- }
- }elseif(header.intent!=null){
- startActivity(header.intent);
- }
- }
我们在这个方法内看到,首先判断fragment以及intent,然后会根据mSinglePane来判断进入那个逻辑里。mSinglePane是单屏幕或者双屏幕,此处为false。
在双屏幕中,此处会执行switchToHeader(header)方法。
2.2、
[java] view plain copy- if(mCurHeader==header){
- //Thisistheheaderwearecurrentlydisplaying.Justmakesure
- //topopthestackuptoitsrootstate.
- getFragmentManager().popBackStack(BACK_STACK_PREFS,
- FragmentManager.POP_BACK_STACK_INCLUSIVE);
- }else{
- intdirection=mHeaders.indexOf(header)-mHeaders.indexOf(mCurHeader);
- switchToHeaderInner(header.fragment,header.fragmentArguments,direction);
- setSelectedHeader(header);
- }
这里首先会判断mCurrentHeader是否为要切换的header。如果mCurrentHeader == header,那么执行:
[java] view plain copy- getFragmentManager().popBackStack(BACK_STACK_PREFS,
- FragmentManager.POP_BACK_STACK_INCLUSIVE);
否则:
- intdirection=mHeaders.indexOf(header)-mHeaders.indexOf(mCurHeader);
- switchToHeaderInner(header.fragment,header.fragmentArguments,direction);
- setSelectedHeader(header);
在这里,direction没有发挥作用。这里应该是判断ListView是向上滚动还是向下滚动。
我们看switchToHeaderInnr方法。
2.3、
[java] view plain copy- getFragmentManager().popBackStack(BACK_STACK_PREFS,
- FragmentManager.POP_BACK_STACK_INCLUSIVE);
- Fragmentf=Fragment.instantiate(this,fragmentName,args);
- FragmentTransactiontransaction=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方法。
[java] view plain copy- voidsetSelectedHeader(Headerheader){
- mCurHeader=header;
- intindex=mHeaders.indexOf(header);
- if(index>=0){
- getListView().setItemChecked(index,true);
- }else{
- getListView().clearChoices();
- }
- showBreadCrumbs(header);
- }
在这个方法中主要处理ListView的setItemChecked状态。如上图中蓝牙设置项的选中底色。并且设置Breadcrumb(标题)
2.5、
- voidshowBreadCrumbs(Headerheader){
- if(header!=null){
- CharSequencetitle=header.getBreadCrumbTitle(getResources());
- if(title==null)title=header.getTitle(getResources());
- if(title==null)title=getTitle();
- showBreadCrumbs(title,header.getBreadCrumbShortTitle(getResources()));
- }else{
- showBreadCrumbs(getTitle(),null);
- }
- }
[java] view plain copy
- if(mFragmentBreadCrumbs==null){
- Viewcrumbs=findViewById(android.R.id.title);
- //Forscreenswithadifferentkindoftitle,don'tcreatebreadcrumbs.
- try{
- mFragmentBreadCrumbs=(FragmentBreadCrumbs)crumbs;
- }catch(ClassCastExceptione){
- 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方法:
[java] view plain copy- publicvoidswitchToHeader(Headerheader){
- if(!mInLocalHeaderSwitch){
- mCurrentHeader=null;
- mParentHeader=null;
- }
- super.switchToHeader(header);
- }
mInLocalHeaderSwitch在我们点击条目的时候为false,故,Settings.java中定义的mCurrentHeader以及mParentHeader会赋值null。然后执行super.switchToHeader()。
二、外部通过Action进入设置应用的流程。(多屏幕的状态下)
[java] view plain copy- Intentintent=newIntent();
- //intent.setClassName(this,"c");
- //intent.setAction("android.intent.action.PICK_ACTIVITY");
- intent.setAction("android.settings.WIFI_IP_SETTINGS");
- startActivity(intent);
通过上述代码,会进入如下界面。
启动这个界面会经历如下流程,
首先Settigns.java的onCreate方法。
1、
[java] view plain copy- protectedvoidonCreate(BundlesavedInstanceState){
- if(getIntent().getBooleanExtra(EXTRA_CLEAR_UI_OPTIONS,false)){
- getWindow().setUiOptions(0);
- }
- getMetaData();
- mInLocalHeaderSwitch=true;
- super.onCreate(savedInstanceState);
- mInLocalHeaderSwitch=false;
- if(!onIsHidingHeaders()&&onIsMultiPane()){
- highlightHeader();
- //Forcethetitlesothatitdoesn'tgetoverriddenbyadirectlaunchof
- //aspecificsettingsscreen.
- setTitle(R.string.settings_label);
- }
- //Retrieveanysavedstate
- if(savedInstanceState!=null){
- mCurrentHeader=savedInstanceState.getParcelable(SAVE_KEY_CURRENT_HEADER);
- mParentHeader=savedInstanceState.getParcelable(SAVE_KEY_PARENT_HEADER);
- }
- //Ifthecurrentheaderwassaved,switchtoit
- if(savedInstanceState!=null&&mCurrentHeader!=null){
- //switchToHeaderLocal(mCurrentHeader);
- showBreadCrumbs(mCurrentHeader.title,null);
- }
- if(mParentHeader!=null){
- setParentTitle(mParentHeader.title,null,newOnClickListener(){
- publicvoidonClick(Viewv){
- switchToParent(mParentHeader.fragment);
- }
- });
- }
- //TODOAddsupportforandroid.R.id.homeinallSetting'sonOptionsItemSelected
- //getActionBar().setDisplayOptions(ActionBar.DISPLAY_HOME_AS_UP,
- //ActionBar.DISPLAY_HOME_AS_UP);
- }
在这个方法内,首先执行getIntent方法,Settings重新了这个方法。
2、
[java] view plain copy- publicIntentgetIntent(){
- IntentsuperIntent=super.getIntent();
- StringstartingFragment=getStartingFragmentClass(superIntent);
- //Thisiscalledfromsuper.onCreate,isMultiPane()isnotyetreliable
- //DonotuseonIsHidingHeaderseither,whichreliesitselfonthismethod
- if(startingFragment!=null&&!onIsMultiPane()){
- IntentmodIntent=newIntent(superIntent);
- modIntent.putExtra(EXTRA_SHOW_FRAGMENT,startingFragment);
- Bundleargs=superIntent.getExtras();
- if(args!=null){
- args=newBundle(args);
- }else{
- args=newBundle();
- }
- args.putParcelable("intent",superIntent);
- modIntent.putExtra(EXTRA_SHOW_FRAGMENT_ARGUMENTS,superIntent.getExtras());
- returnmodIntent;
- }
- returnsuperIntent;
- }
在这个方法内,会调用getStartingFragmentClass方法。
[java] view plain copy- protectedStringgetStartingFragmentClass(Intentintent){
- if(mFragmentClass!=null)returnmFragmentClass;
- StringintentClass=intent.getComponent().getClassName();
- if(intentClass.equals(getClass().getName()))returnnull;
- if("com.android.settings.ManageApplications".equals(intentClass)
- ||"com.android.settings.RunningServices".equals(intentClass)
- ||"com.android.settings.applications.StorageUse".equals(intentClass)){
- //Oldnamesofmanageapps.
- intentClass=com.android.settings.applications.ManageApplications.class.getName();
- }
- returnintentClass;
- }
这个方法中,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方法。
[java] view plain copy- privatevoidgetMetaData(){
- try{
- ActivityInfoai=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);
- //CheckifithasaparentspecifiedandcreateaHeaderobject
- finalintparentHeaderTitleRes=ai.metaData.getInt(META_DATA_KEY_PARENT_TITLE);
- StringparentFragmentClass=ai.metaData.getString(META_DATA_KEY_PARENT_FRAGMENT_CLASS);
- if(parentFragmentClass!=null){
- mParentHeader=newHeader();
- mParentHeader.fragment=parentFragmentClass;
- if(parentHeaderTitleRes!=0){
- mParentHeader.title=getResources().getString(parentHeaderTitleRes);
- }
- }
- }catch(NameNotFoundExceptionnnfe){
- //Norecovery
- }
- }
这里,AdvancedWifiSettingsActivity在AndroidManifest.xml中的配置:
[html] view plain copy- <activityandroid:name="Settings$AdvancedWifiSettingsActivity"
- android:label="@string/wifi_advanced_settings_label"
- android:configChanges="orientation|keyboardHidden|screenSize"
- android:clearTaskOnLaunch="true">
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <actionandroid:name="android.settings.WIFI_IP_SETTINGS"/>
- <categoryandroid:name="android.intent.category.VOICE_LAUNCH"/>
- <categoryandroid:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- <meta-dataandroid:name="com.android.settings.FRAGMENT_CLASS"
- android:value="com.android.settings.wifi.AdvancedWifiSettings"/>
- <meta-dataandroid:name="com.android.settings.TOP_LEVEL_HEADER_ID"
- android:resource="@id/wifi_settings"/>
- <meta-dataandroid:name="com.android.settings.PARENT_FRAGMENT_TITLE"
- android:resource="@string/wifi_settings"/>
- <meta-dataandroid: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中的 :
[java] view plain copy- if(!mSinglePane){
- if(initialFragment==null){
- Headerh=onGetInitialHeader();
- switchToHeader(h);
- }else{
- switchToHeader(initialFragment,initialArguments);
- }
- }
Settings.java重写了switchToHeader方法。
[java] view plain copy- publicvoidswitchToHeader(Headerheader){
- if(!mInLocalHeaderSwitch){
- mCurrentHeader=null;
- mParentHeader=null;
- }
- super.switchToHeader(header);
- }
这样mInLocalHeaderSwitch为true,不会清楚mCurrentHeader以及mParentHeader。
最后会执行super.switchToHeader方法,这个方法的执行,会将AdvancedWifiSettings加载到如上图所示的右边的区域内。
Settings.java还重新了onGetInitialHeader方法,这个方法为Header赋了正确的值。
[java] view plain copy- publicHeaderonGetInitialHeader(){
- StringfragmentClass=getStartingFragmentClass(super.getIntent());
- if(fragmentClass!=null){
- Headerheader=newHeader();
- header.fragment=fragmentClass;
- header.title=getTitle();
- header.fragmentArguments=getIntent().getExtras();
- mCurrentHeader=header;
- returnheader;
- }
- returnmFirstHeader;
- }
5、最后一步,给上图左边的部分加上setItemChecked效果。也即是上图中的选中状态底纹。
[java] view plain copy- if(!onIsHidingHeaders()&&onIsMultiPane()){
- highlightHeader();
- //Forcethetitlesothatitdoesn'tgetoverriddenbyadirectlaunchof
- //aspecificsettingsscreen.
- setTitle(R.string.settings_label);
- }
- privatevoidhighlightHeader(){
- if(mTopLevelHeaderId!=0){
- Integerindex=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的使用:
- [java] view plain copy
- publicHeaderonGetInitialHeader(){
- StringfragmentClass=getStartingFragmentClass(super.getIntent());
- if(fragmentClass!=null){
- Headerheader=newHeader();
- header.fragment=fragmentClass;
- header.title=getTitle();
- header.fragmentArguments=getIntent().getExtras();
- mCurrentHeader=header;
- returnheader;
- }
- returnmFirstHeader;
- }
如果getStarttingFragmentClass为null,那么返回mFirstHeader。
- [java] view plain copy
- publicvoidonNewIntent(Intentintent){
- super.onNewIntent(intent);
- //Ifitisnotlaunchedfromhistory,thenresettotop-level
- if((intent.getFlags()&Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)==0
- &&mFirstHeader!=null&&!onIsHidingHeaders()&&onIsMultiPane()){
- switchToHeaderLocal(mFirstHeader);
- }
- }
二、mCurrentHeader的作用,显示当前Header的title。
初始化:
[java] view plain copy- publicHeaderonGetInitialHeader(){
- StringfragmentClass=getStartingFragmentClass(super.getIntent());
- if(fragmentClass!=null){
- Headerheader=newHeader();
- header.fragment=fragmentClass;
- header.title=getTitle();
- header.fragmentArguments=getIntent().getExtras();
- mCurrentHeader=header;
- returnheader;
- }
- returnmFirstHeader;
- }
外部跳转得到了fragmentClass,那么会初始化mCurrentHeader。
另外的一处初始化:
[java] view plain copy- privatevoidswitchToParent(StringclassName){
- finalComponentNamecn=newComponentName(this,className);
- try{
- finalPackageManagerpm=getPackageManager();
- finalActivityInfoparentInfo=pm.getActivityInfo(cn,PackageManager.GET_META_DATA);
- if(parentInfo!=null&&parentInfo.metaData!=null){
- StringfragmentClass=parentInfo.metaData.getString(META_DATA_KEY_FRAGMENT_CLASS);
- CharSequencefragmentTitle=parentInfo.loadLabel(pm);
- HeaderparentHeader=newHeader();
- parentHeader.fragment=fragmentClass;
- parentHeader.title=fragmentTitle;
- mCurrentHeader=parentHeader;
- switchToHeaderLocal(parentHeader);
- highlightHeader();
- mParentHeader=newHeader();
- mParentHeader.fragment
- =parentInfo.metaData.getString(META_DATA_KEY_PARENT_FRAGMENT_CLASS);
- mParentHeader.title=parentInfo.metaData.getString(META_DATA_KEY_PARENT_TITLE);
- }
- }catch(NameNotFoundExceptionnnfe){
- Log.w(LOG_TAG,"Couldnotfindparentactivity:"+className);
- }
- }
使用:
在onCreate中。
[java] view plain copy- if(savedInstanceState!=null){
- mCurrentHeader=savedInstanceState.getParcelable(SAVE_KEY_CURRENT_HEADER);
- mParentHeader=savedInstanceState.getParcelable(SAVE_KEY_PARENT_HEADER);
- }
- //Ifthecurrentheaderwassaved,switchtoit
- if(savedInstanceState!=null&&mCurrentHeader!=null){
- //switchToHeaderLocal(mCurrentHeader);
- showBreadCrumbs(mCurrentHeader.title,null);
- }
三、mParentHeader,
初始化:
[java] view plain copy- privatevoidgetMetaData(){
- try{
- ActivityInfoai=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);
- //CheckifithasaparentspecifiedandcreateaHeaderobject
- finalintparentHeaderTitleRes=ai.metaData.getInt(META_DATA_KEY_PARENT_TITLE);
- StringparentFragmentClass=ai.metaData.getString(META_DATA_KEY_PARENT_FRAGMENT_CLASS);
- if(parentFragmentClass!=null){
- mParentHeader=newHeader();
- mParentHeader.fragment=parentFragmentClass;
- if(parentHeaderTitleRes!=0){
- mParentHeader.title=getResources().getString(parentHeaderTitleRes);
- }
- }
- }catch(NameNotFoundExceptionnnfe){
- //Norecovery
- }
- }
使用如上面的mCurrentHeader。
更多相关文章
- 【翻译】4种经典的Android屏幕自适应解决方案
- Android网络通信(4):WebKit
- Qt Android(安卓)部署项目时报错
- android MediaPlayer 几种播放方式
- ContentProvider何时创建?SQLiteDatabase方法何时执行?
- Path
- Android接收短信-createFromPdu
- Android属性动画---Property Animation(六)
- 倍数提高工作效率的 Android(安卓)Studio 奇技