Settings界面分析

1.主界面frameworks/base/packages/SettingsLib/res/layout/settings_with_drawer

 packages\apps\Settings\AndroidManifest.xml ,关键字android.intent.category.LAUNCHER,其实现类为Settings
<activity-alias android:name="Settings"
               android:taskAffinity="com.android.settings"
               android:label="@string/settings_label_launcher"
               android:launchMode="singleTask"
               android:targetActivity="Settings">  //目标文件及实现类
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.DEFAULT" />
               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
           <meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts"/>
  </activity-alias>

Settings.java总共有124个子类,继承SettingsActivity,SettingsActivity继承SettingsDrawerActivity,查看SettingsDrawerActivity,加载了布局文件settings_with_drawer,位于frameworks/base/packages/SettingsLib/res/layout/
主界面包括action_bar和两个FrameLayout content_header_container 和content_frame
侧拉栏为一个ListView left_drawer

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    <!-- The main content view -->
 <LinearLayout
        android:id="@+id/content_parent" >
        <FrameLayout">
            <Toolbar
                xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/action_bar" />
        </FrameLayout>
        <FrameLayout
            android:id="@+id/content_header_container" />
        <FrameLayout
            android:id="@+id/content_frame" />
    </LinearLayout>
    <!-- The navigation drawer -->
    <ListView android:id="@+id/left_drawer" />
</android.support.v4.widget.DrawerLayout>

分析SettingsDrawerActivity可以知道
content_header_container通过setContentHeaderView设置,在DashboardContainerFragment中的onResume调用
content_frame通过setContentView设置
left_drawer通过适配器SettingsDrawerAdapter设置
返回到SettingsActivity的OnCreate,

if (intent.hasExtra(EXTRA_LAUNCH_ACTIVITY_ACTION)) {
      startActivity(new Intent(mActivityAction));} //主ACTIVITY
 mIsShowingDashboard = className.equals(Settings.class.getName())
                || className.equals(Settings.WirelessSettings.class.getName())
                || className.equals(Settings.DeviceSettings.class.getName())
                || className.equals(Settings.PersonalSettings.class.getName())
                || className.equals(Settings.WirelessSettings.class.getName()); //决定加载哪个布局文件
setContentView(mIsShowingDashboard ? R.layout.settings_main_dashboard : R.layout.settings_main_prefs);

2.packages/apps/Settings/res/layout/settings_main_dashboard.xml

当为WirelessSettings,DeviceSettings,PersonalSettings时进行调用,settings_main_dashboard中只有一个FrameLayout main_content

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@+id/main_content"
             android:layout_height="match_parent"
             android:layout_width="match_parent"
             android:background="@color/material_grey_300"
             />

返回到SettingsActivity的OnCreate

//OnCreate
switchToFragment(DashboardContainerFragment.class.getName()    //传进DashboardContainerFragment
 
//switchToFragment
 transaction.replace(R.id.main_content, f);//将main_content替换为DashboardContainerFragment

查看DashboardContainerFragment中的onCreateView,给dashboard_container中的pager添加了适配器DashboardViewPagerAdapter,监听器TabChangeListener,并赋给R.layout.dashboard_container_header

ublic View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
       final View content = inflater.inflate(R.layout.dashboard_container, parent, false);
       mViewPager = (RtlCompatibleViewPager) content.findViewById(R.id.pager); //获取到dashboard_container中的pager
        mPagerAdapter = new DashboardViewPagerAdapter(getContext(),
               getChildFragmentManager(), mViewPager);
       mViewPager.setAdapter(mPagerAdapter);
       mViewPager.addOnPageChangeListener(
               new TabChangeListener((SettingsActivity) getActivity()));
       // check if support tab needs to be selected
       final String selectedTab = getArguments().
           getString(EXTRA_SELECT_SETTINGS_TAB, ARG_SUMMARY_TAB);
       if (TextUtils.equals(selectedTab, ARG_SUPPORT_TAB)) {
           mViewPager.setCurrentItem(INDEX_SUPPORT_FRAGMENT);
       } else {
           mViewPager.setCurrentItem(INDEX_SUMMARY_FRAGMENT);//设置为0
       }
 
       mHeaderView = inflater.inflate(R.layout.dashboard_container_header, parent, false);
       ((SlidingTabLayout) mHeaderView).setViewPager(mViewPager);//赋值给R.layout.dashboard_container_header
        return content;
   }

查看DashboardViewPagerAdapter,继承FragmentPagerAdapter.java,在getItem中返回DashboardSummary
查看DashboardSummary,在onCreate中创建了SummaryLoader
在onCreateView 返回了dashboard

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.dashboard, container, false);
    }

在onViewCreated设置了适配器DashboardAdapter

ublic void onViewCreated(View view, Bundle bundle) {
        mDashboard = (FocusRecyclerView) view.findViewById(R.id.dashboard_container);
        mLayoutManager = new LinearLayoutManager(getContext());
        mLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        mDashboard.setLayoutManager(mLayoutManager);//设置布局为垂直线性布局
        mDashboard.setHasFixedSize(true);
        mDashboard.setListener(this);
        mDashboard.addItemDecoration(new DashboardDecorator(getContext()));//设置分隔线
        mAdapter = new DashboardAdapter(getContext(), mSuggestionParser, bundle,
                mConditionManager.getConditions());
        mDashboard.setAdapter(mAdapter);//设置适配器为DashboardAdapter
        mSummaryLoader.setAdapter(mAdapter);
        ConditionAdapterUtils.addDismiss(mDashboard);
        if (DEBUG_TIMING) Log.d(TAG, "onViewCreated took "
                + (System.currentTimeMillis() - startTime) + " ms");
        rebuildUI();
    }

3.packages/apps/Settings/res/layout/dashboard_tile_switch.xml

每一行的布局
查看DashboardAdapter,继承RecyclerView
在onCreateViewHolder中加载了布局文件packages/apps/Settings/res/layout/dashboard_tile_switch.xml

public DashboardItemHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new DashboardItemHolder(LayoutInflater.from(parent.getContext()).inflate(
                viewType, parent, false), (viewType == R.layout.dashboard_tile_switch));
    }
  //dashboard_tile_switch.xml
  <LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/dashboard_tile_switch" >
    <ImageView
        android:id="@android:id/icon" /> //图标
    <RelativeLayout>
        <LinearLayout
            android:orientation="vertical">
            <TextView android:id="@android:id/title" />
            <TextView android:id="@android:id/summary" />
        </LinearLayout>
        <Switch android:id="@+id/switchWidget" /> 
    </RelativeLayout>
 
</LinearLayout>
``
`
在onBindViewHolder进行显示 

```java
public void onBindViewHolder(DashboardItemHolder holder, int position) {
       switch (mTypes.get(position)) {
           case R.layout.dashboard_category://对应类别
           onBindCategory(holder, (DashboardCategory) mItems.get(position));
               break;
           case R.layout.dashboard_tile://对应每个item
           final Tile tile = (Tile) mItems.get(position);
               onBindTile(holder, tile);
               holder.itemView.setTag(tile);
               holder.itemView.setOnClickListener(this);//点击事件
               break;
           case R.layout.dashboard_tile_switch:
              .....;
           case R.layout.suggestion_header:
              ...;
           case R.layout.suggestion_tile:
              ...;
           case R.layout.see_all:
               ...;
           case R.layout.condition_card:
              ...;
       }
   }

onClick中每个Item点击调用的是((SettingsActivity) mContext).openTile((Tile) v.getTag());

4. rebuildUI

返回到DashboardSummary中的onViewCreated,这里会调用rebuildUI

private void rebuildUI() {
        if (!isAdded()) {
            Log.w(TAG, "Cannot build the DashboardSummary UI yet as the Fragment is not added");
            return;
        }
 
        List<DashboardCategory> categories =
                ((SettingsActivity) getActivity()).getDashboardCategories(); //获取的categories为
        mAdapter.setCategories(categories); //这里设置
        // recheck to see if any suggestions have been changed.
        new SuggestionLoader().execute();
    }

分析getDashboardCategories ,调用逻辑为
SettingsDrawerActivity.java中的getDashboardCategories
–>TileUtils.getCategories(this, sTileCache); //传进的sTileCache为一个空的HashMap
→getTilesForAction
–>List results = pm.queryIntentActivitiesAsUser //获取AndroidManifest.xml

List<ResolveInfo> results = pm.queryIntentActivitiesAsUser(intent,
                PackageManager.GET_META_DATA, user.getIdentifier());
ActivityInfo activityInfo = resolved.activityInfo;
Bundle metaData = activityInfo.metaData;  //解析meta-data节点
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Settings模块是Android系统中的一个重要组成部分,它提供了用户对设备进行配置和管理的界面。它是一个完整的应用程序,由多个Activity和Fragment组成,主要包括以下几个部分: 1. 系统设置:包括网络、声音、显示、电池、存储、安全等设置,用户可以根据自己的需要对系统进行设置。 2. 应用设置:包括已安装应用的管理和配置,用户可以查看应用信息、权限、通知、存储、数据使用情况等。 3. 用户设置:包括用户账户和个人资料的管理和配置,用户可以添加、删除、切换用户账户,还可以修改个人资料、语言、时区等。 4. 开发者选项:为开发者提供了一些高级设置和调试工具,例如USB调试、CPU使用情况、布局边界等。 5. 关于手机:提供了设备的基本信息,包括设备型号、Android版本、内核版本、基带版本等。 Android Settings模块的实现主要依赖于Android框架中的SettingsProvider和Settings应用程序。SettingsProvider是一个ContentProvider,为Settings应用程序提供数据源,包括系统设置、应用设置、用户设置等。Settings应用程序则负责展示这些数据并提供用户交互界面。 总的来说,Android Settings模块为用户提供了方便、实用的设备配置和管理功能,同时为开发者提供了一些高级设置和调试工具,是Android系统中非常重要的一个组成部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值