Settings如何去掉 设置-安全里面的部分菜单

android版本5.1

首先来讲解一下Settings首界面的形成过程

这个过程的分析我是参考了另外的一篇文章,获益匪浅。

Settings模块的顶层类是Settings

Settings继承了SettingsActivity

Settings里面没有重写父类的方法,只有一大批内部类

这些内部类全部继承了SettinsActivity

SettinsActivity继承了Activity,实现了很多接口

进入onCreate方法中去查看

如果是在Settings的主界面,则mIsShowingDashboard=true

如果进入Settings的子界面,则mIsShowingDashboard=false,isSubSettings=true

mIsShowingDashboard为true

isSubsettings的值是false

setContentView(mIsShowingDashboard ?
                R.layout.settings_main_dashboard : R.layout.settings_main_prefs);

        mContent = (ViewGroup) findViewById(R.id.main_content);

上面的代码定义了Settings主界面最外层的布局

由于mIsShowingDashboard为true

直接走到下面这段代码

else {
                // No UP affordance if we are displaying the main Dashboard
                mDisplayHomeAsUpEnabled = false;
                // Show Search affordance
                mDisplaySearch = true;
                mInitialTitleResId = R.string.dashboard_title;
                switchToFragment(DashboardSummary.class.getName(), null, false, false,
                        mInitialTitleResId, mInitialTitle, false);
            }

里面有一句跳转到DashboardSummary这个Fragment.

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

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

DashboardSummary.中rebuildUI方法:

private void rebuildUI(Context context) {
        if (!isAdded()) {
            Log.w(LOG_TAG, "Cannot build the DashboardSummary UI yet as the Fragment is not added");
            return;
        }

        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);
        }
        long delta = System.currentTimeMillis() - start;
        Log.d(LOG_TAG, "rebuildUI took: " + delta + " ms");
    }


</pre><pre>
里面看到调用了SettingsActivity的getDashboardCategories方法来获得

一个DashboardCategory的集合

找到getDashboardCategories方法

里面调用了buildDashboardCategories方法:

 private void buildDashboardCategories(List<DashboardCategory> categories) {
        categories.clear();
        loadCategoriesFromResource(R.xml.dashboard_categories, categories);
        updateTilesList(categories);
    }

通过 R.xml.dashboard_categories来加载categories,

这里的categorys为ArrayList<DashboardCategory>mCategories

来查看dashboard_categories这个xml文件

根据它我们知道了

Settings主界面的布局文件为dashboard_categories

根据这个文件我们可以知道了,所谓的dashboard就是Settings模块首界面的一个抽象。

而dashboard-categorys则是设置分类集合的抽象,而dashboard-category是分类的抽象,

dashboard-tile就是分类下每个选项的抽象了。代码中的List<DashboardCategory>对应dashboard-categorys,

 DashboardCategory对应dashboard-category,而dashboard-tile则对因代码中的DashboardTile。

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

这个过程是在DashboardSummary.rebuildUI()中完成的

到这里SettingsActivity的onCreate方法就算结束了。总结一下,

    1.onCreate完成的任务是切换DashboardSmmary这个Fragment,

然后从dashboard_categories.xml中读取预先配置好的文件来初始化Settings的首界面视图。

    2.L中舍弃了Header类,取而代之的是DashboardCategory和DashboardTile类。


主界面初始化讲完了

下面来分析如何去掉个人——安全里的几个选项菜单

例如要去掉SmartLock和屏幕固定两个选项

点击安全,我们进入到SecuritySettings这个Fragment里面

绘制界面的方法是createPreferenceHierarchy

这个方法用到了以往Settings常用的preference机制

它加载view的时候有直接通过在代码加载,也有通过xml文件来加载的

addPreferencesFromResource这个方法是用来读取加载xml文件的

在SecuritySettings里面从SIM卡锁定方式开始都是读取的security_settings_misc.xml

所以要删除掉屏幕固定这个选项,直接将以下代码注释掉

<PreferenceScreen
                android:key="screen_pinning_settings"
                android:title="@string/screen_pinning_title"
                android:summary="@string/switch_off_text"
                android:fragment="com.android.settings.ScreenPinningSettings"/>



未完待续。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。












评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值