ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Settings 启动流程

2022-09-05 20:04:37  阅读:337  来源: 互联网

标签:启动 流程 settings final item TAG android void Settings


Settings 启动流程

  1. Settings-->Manifest.xml-->action.MAIN-->SettingsHomepageActivity

    public class SettingsHomepageActivity extends FragmentActivity {
     @Override
       protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
      //Settings首页布局
           setContentView(R.layout.settings_homepage_container);
           //一级菜单主要内容,跳转至TopLevelSettings显示
           showFragment(new TopLevelSettings(), R.id.main_content);
      }
    }
    public class TopLevelSettings extends DashboardFragment {
           //根据Fragment生命周期运行
            @Override
       public void onAttach(Context context) {
           super.onAttach(context);
           //获取item controler并设置对应的Activity,locate in DashboardFragment.java
    use(SupportPreferenceController.class).setActivity(getActivity());
          ...
           //fragment剩余生命周期在执行父类DashboardFragment中的生命周期
      }
       
           @Override
       protected String getLogTag() {
           return TAG;//TAG = "TopLevelSettings"
      }
       //获取main_item 布局id
           @Override
       protected int getPreferenceScreenResId() {
           return R.xml.top_level_settings;
      }
           
    }
    public abstract class DashboardFragment extends SettingsPreferenceFragment {
    ...
    @Override
       public void onCreate(Bundle icicle) {
           super.onCreate(icicle);
           // Set ComparisonCallback so we get better animation when list changes.
           getPreferenceManager().setPreferenceComparisonCallback(
                   new PreferenceManager.SimplePreferenceComparisonCallback());
         
           if (icicle != null) {
               // Upon rotation configuration change we need to update preference states before any
               // editing dialog is recreated (that would happen before onResume is called).
               //首次不调用,初始化Controller。第二次调用,更新Preference
               updatePreferenceStates();
          }
      }
       //Log显示调用方法创建Preference列表
           @Override
       public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
           refreshAllPreferences(getLogTag());
      }
       
       //TopLevelSettings.java重写该方法
       protected abstract String getLogTag();
       
       private void refreshAllPreferences(final String TAG) {
           final PreferenceScreen screen = getPreferenceScreen();
           // First remove old preferences.
           if (screen != null) {
               // Intentionally do not cache PreferenceScreen because it will be recreated later.
               screen.removeAll();
          }

           // Add resource based tiles.
           displayResourceTiles();//静态方式加载Settings一级菜单main item

           refreshDashboardTiles(TAG);//动态刷新main_content 状态

           final Activity activity = getActivity();
           if (activity != null) {
               Log.d(TAG, "All preferences added, reporting fully drawn");
               activity.reportFullyDrawn();
          }

           updatePreferenceVisibility(mPreferenceControllers);
      }
       
           private void displayResourceTiles() {
          final int resId = getPreferenceScreenResId();//TopLevelSettings.java重写该方法获取main_content对应布局id
          if (resId <= 0) {
               return;
          }
          addPreferencesFromResource(resId);
      }
     
           void refreshDashboardTiles(final String TAG) {
          final PreferenceScreen screen = getPreferenceScreen();

        final DashboardCategory category =
                   mDashboardFeatureProvider.getTilesForCategory(getCategoryKey());
          if (category == null) {
               Log.d(TAG, "NO dashboard tiles for " + TAG);
               return;
          }
          ....
          }
       
       
           protected <T extends AbstractPreferenceController> T use(Class<T> clazz) {
          List<AbstractPreferenceController> controllerList = mPreferenceControllers.get(clazz);
          if (controllerList != null) {
               if (controllerList.size() > 1) {
                   Log.w(TAG, "Multiple controllers of Class " + clazz.getSimpleName()
                           + " found, returning first one.");
              }
              return (T) controllerList.get(0);
          }

          return null;
      }
    }
     
    //top_level_settings.xml

    <PreferenceScreen
       xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:settings="http://schemas.android.com/apk/res-auto"
       android:key="top_level_settings">
           <Preference
           android:key="top_level_network"
           android:title="@string/network_dashboard_title"
           android:summary="@string/summary_placeholder"
           android:icon="@drawable/ic_homepage_network"
           android:order="-120"
           android:fragment="com.android.settings.network.NetworkDashboardFragment"
           settings:controller="com.android.settings.network.TopLevelNetworkEntryPreferenceController"/>
          ...
           <Preference
           android:key="top_level_security" //每个item必须有key属性
           android:title="@string/security_settings_title"
           android:summary="@string/summary_placeholder"
           android:icon="@drawable/ic_homepage_security"
           android:order="-40" //负值:绝对值越大越靠前;正值,绝对值越大越靠后
           android:fragment="com.android.settings.security.SecuritySettings" //点击item对应跳转的fragment
           settings:controller="com.android.settings.security.TopLevelSecurityEntryPreferenceController"/> //当前item的controller;每个item都必须要有该属性,也可直接在相关fragment中实现createPreferenceControllers()方法去调用构造相关controller.
         
          ....
       
       
    </PreferenceScreen>    
  2.  

标签:启动,流程,settings,final,item,TAG,android,void,Settings
来源: https://www.cnblogs.com/a-n-yan/p/16659361.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有