Android 设置模块

来源:互联网 发布:waf绕过软件 编辑:程序博客网 时间:2024/06/11 01:51

一) Android Setting 
   Android设置之UI篇
http://www.cnblogs.com/yinhaojun/p/3868901.html
关键点:
 (1)PreferenceActivity => 设置的界面定义为framework中的preference_list_content.xml
通过查看preference_list_content.xml文件我们知道该布局的结构就是左右结构,左侧为一个ListView,右侧为一个PreferenceFrameLayout。
   class Settings extends PreferenceActivity    
注:android 5.0 
   class Settings extends SettingsActivity 
   在Settings类中定义了静态类 (注:如果要添加自己的Activity 先要在这里加一个定义)
   public static class BluetoothSettingsActivity extends SettingsActivity { /* empty */ }
   public static class WirelessSettingsActivity extends SettingsActivity { /* empty */ } 
  看注释可以知道,这些子类是为了启动特定独立的Settings选项而创建的,例如在某个应用里需要设置无线那么只需要启动 WirelessSettingsActivity 就可以了。
  SettingsActivity.onCreate方法
    getMetaData();
这个方法用来获得Activity的额外数据mFragmentClass,如果可以获得这个数据,那么下面会去显示mFragmentClass对应的Activity。直接启动Settings模块不会获得这个数据
  
  mIsShowingDashboard = className.equals(Settings.class.getName());
  这一步很重要,因为我们是从Settings这个Activity过来的,所以这里的 mIsShowingDashboard 为 true 。
  
 switchToFragment(DashboardSummary.class.getName(), null, false, false,
 
                        mInitialTitleResId, mInitialTitle, false);
这里看到switchToFragment这个方法,可以知道这里是要切换DashboardSummary这个Fragment.


接下来就看看DashboardSummary是个什么玩意?


dashboard中文意思是仪表盘,这里是指DashboardSummary就是用来显示Settings所有选项的。


在DashboardSummary的onCreateView里加载了这个布局文件R.layout.dashboard


/packages/apps/Settings/res/layout/dashboard.xml


    看了上面的布局文件可以知道Settings的选项视图应该就是显示在dashboard_container中了。
              <LinearLayout
                android:id="@+id/dashboard_container"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center_horizontal"
                android:paddingStart="@dimen/dashboard_padding_start"
                android:paddingEnd="@dimen/dashboard_padding_end"
                android:paddingTop="@dimen/dashboard_padding_top"
                android:paddingBottom="@dimen/dashboard_padding_bottom"
                android:orientation="vertical"
                />


DashboardSummary走完onCreateView方法后会走onResume,然后一路下来又会调到SettingsActivity的
 loadCategoriesFromResource


(2) 左侧Header添加 主要是从资源文件中加载
   /packages/apps/Settings/res/xml/settings_headers.xml 
  <header> </header>
  注:android 5.0 对应是下面这个xml
    loadCategoriesFromResource(R.xml.dashboard_categories, categories);
  /packages/apps/Settings/res/xml/dashboard_categories.xml
 
<dashboard-category  android:id="@+id/wireless_section"
            android:title="@string/header_category_wireless_networks" >


      <dashboard-tile android:id="@+id/wifi_settings"  
                android:title="@string/wifi_settings_title"
                android:fragment="com.android.settings.wifi.WifiSettings"
                android:icon="@drawable/ic_settings_wireless"


       />


 </dashboard-category>
根据这个文件我们可以知道了,所谓的dashboard就是Settings模块首界面的一个抽象。而dashboard-categorys则是设置分类集合的抽象,而dashboard-category是分类的抽象,dashboard-tile就是分类下每个选项的抽象了。代码中的List对应dashboard-categorys, DashboardCategory对应dashboard-category,而dashboard-tile则对因代码中的DashboardTile。


当加载完这些对象后SettingsActivity会将得到的 mCategories 返回给DashboardSummary来初始化Settings的设置选项。


(3)下面这段代码就是DashboardSummary.rebuildUI()中完成界面的初始化
  
long start = System.currentTimeMillis();
 final Resources res = getResources();
 mDashboard.removeAllViews();
  List<dashboardcategory> categories =((SettingsActivity) context).getDashboardCategories(true);
 
 final int count = categories.size();


  for (int n = 0; n < count; n++) {
            DashboardCategory category = categories.get(n);
            View categoryView = mLayoutInflater.inflate(R.layout.dashboard_category, mDashboard, false);


            TextView categoryLabel = (TextView) categoryView.findViewById(R.id.category_title);
 
            categoryLabel.setText(category.getTitle(res));


            ViewGroup categoryContent =(ViewGroup) categoryView.findViewById(R.id.category_content);
 
            final int tilesCount = category.getTilesCount();
 
            for (int i = 0; i < tilesCount; i++) {
 
                DashboardTile tile = category.getTile(i);
 
                DashboardTileView tileView = new DashboardTileView(context);
 
                updateTileView(context, res, tile, tileView.getImageView(),
 
                tileView.getTitleTextView(), tileView.getStatusTextView());


                tileView.setTile(tile);
 
                categoryContent.addView(tileView);
 
            }
 
            // Add the category
 
            mDashboard.addView(categoryView);
 
        }


  这段代码我就不具体分析了,逻辑很简单,遍历categories这个列表来获取DashboardCategory对象,将所有DashboardCategory对象和DashboardCategory对象中的DashboardTile对象转化为视图对象并添加到主视图对象mDashboard中。


二) 应用程序调用

      

 Intent intent = new Intent(android.provider.Settings.ACTION_DISPLAY_SETTINGS);startActivity(intent);
android.provider.Settings.ACTION_DISPLAY_SETTINGS  变量定义在frameworks/base/core/java/android/provider/Settings.java 中
如果自己有添加,这里也要修改
三) 修改
http://blog.csdn.net/wzy_1988/article/details/50556113

0 0
原创粉丝点击