Android 7.0(N) Settings 修改Icon 与侧拉栏不同步问题

来源:互联网 发布:html ccs js 编辑:程序博客网 时间:2024/05/24 07:29

Android N Settings模块与Android M Settings模块差异参考链接 :http://blog.csdn.net/niexu19900104/article/details/53026132#reply

侧拉栏数据适配器

\frameworks\base\packages\SettingsLib\src\com\android\settingslib\drawerSettingsDrawerAdapter.java


 void updateCategories() {        List<DashboardCategory> categories = mActivity.getDashboardCategories();        mItems.clear();        // Spacer.        mItems.add(null);        Item tile = new Item();        tile.label = mActivity.getString(R.string.home);        tile.icon = Icon.createWithResource(mActivity, R.drawable.home);        mItems.add(tile);        for (int i = 0; i < categories.size(); i++) {            Item category = new Item();            category.icon = null;            DashboardCategory dashboardCategory = categories.get(i);            category.label = dashboardCategory.title;            mItems.add(category);            for (int j = 0; j < dashboardCategory.tiles.size(); j++) {                tile = new Item();                Tile dashboardTile = dashboardCategory.tiles.get(j);                tile.label = dashboardTile.title;               // 默认是dashboardTile.icon; 自己可以替换图片可以控制和Settings主页不同的icon                tile.icon =Icon.createWithResource(mActivity,R.drawable.bluetooth);                tile.tile = dashboardTile;                mItems.add(tile);            }        }        notifyDataSetChanged();    }





getCategories()方法差不多可分为三步:

1.先调用getTilesForAction() ->getTilesForInten()从AndroidMainifast.xml中声明的activity信息中解析,并将解析的数据以Tile类型数据结构封装。

2,遍历存储所有Tile的集合,将通过tile.category属性,将其分类,并构建成category,并将category存储在对应的categoryMap中。

3.构建categories,并且排序,排序是按照DashboardCategory的priority排序的。

先看一下Title数据类型,它里面封装的每一个变量都是和AndroidMainifast.xml中声明Activity时<meta-data/>标签一一对应的。

Title : 对应每个item显示的标题
icon :对应每个Item显示的图标
summary : 对应每个item显示的详细信息,summary
intent :item 对应的intent
cetagory :item 属于哪一个catagory
priority : item 的位置有关,排序会用到
extras :Optional additional data for use by subclasses of the activity,从启动它的类携带过来的信息
meta-data :The metaData from the activity that defines this tile,定义的meta-data


通过这样的方法获取到了Settings主菜单和左后滑动抽屉效果需要显示的数据,然后将数据抛给SettingsDrawerAdapter,在它的getView方法中去创建对应的view,就将界面展示出来了。
Android N设置中没有主界面显示的布局文件,而是直接解析AndroidManifast.xml文件,从该文件中获得并处理要显示的信息。


最终其实只要修改drawer_item.xml下面的一个属性即可,图层属性渲染覆盖了我们资源图
\frameworks\base\packages\SettingsLib\res\layout\drawer_item.xml

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/tile_item"android:layout_width="match_parent"android:layout_height="wrap_content"android:minHeight="48dp"android:orientation="horizontal" ><ImageViewandroid:id="@android:id/icon"android:layout_width="72dp"android:layout_height="24dp"android:layout_gravity="center_vertical"android:tint="?android:attr/colorAccent" //移除掉这里的颜色渲染属性 否则图形出不来android:paddingStart="16dp"android:paddingEnd="32dp" /><TextViewandroid:id="@android:id/title"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:textColor="?android:attr/colorControlNormal"android:textAppearance="?android:attr/textAppearanceMedium" /></LinearLayout>