settings下新添加的菜单如何让search可以搜索到

1.在做此操作时,前提是新增加的菜单已经可以显示,

2.增加两个地方:

2.1 \packages\apps\Settings\src\com\android\settings\search\Ranking.java

sRankMap.put(UsbmodeSettings.class.getName(), RANK_USB_MODE); // class name & Rank id为新增加的项

2.2 \packages\apps\Settings\src\com\android\settings\search\SearchIndexableResources.java

sResMap.put(UsbmodeSettings.class.getName(),
new SearchIndexableResource(
Ranking.getRankForClassName(UsbmodeSettings.class.getName()),
NO_DATA_RES_ID,
//R.xml.usbmode_settings,
UsbmodeSettings.class.getName(),
R.drawable.ic_settings_storage));

两种方式,一种是直接在new SearchIndexableResource() 时传入布局文件,另一种为"NO_DATA_RES_ID"表示此搜索项匹配没有需要解析的xml文件,此xml的解析在Index.java中,  采用第二种时,需要在对应的类中创建一个SEARCH_INDEX_DATA_PROVIDER,类型为SearchIndexProvider,继承BaseSearchIndexProvider并复写其两个方法 

Index.java中对这两种方式的处理逻辑如下:

private void indexOneResource(SQLiteDatabase database, String localeStr,
            SearchIndexableResource sir, Map<String, List<String>> nonIndexableKeysFromResource) {


        if (sir == null) {
            Log.e(LOG_TAG, "Cannot index a null resource!");
            return;
        }


        final List<String> nonIndexableKeys = new ArrayList<String>();


        if (sir.xmlResId > SearchIndexableResources.NO_DATA_RES_ID) {//当为具体的xml处理
            List<String> resNonIndxableKeys = nonIndexableKeysFromResource.get(sir.packageName);
            if (resNonIndxableKeys != null && resNonIndxableKeys.size() > 0) {
                nonIndexableKeys.addAll(resNonIndxableKeys);
            }


            indexFromResource(sir.context, database, localeStr,
                    sir.xmlResId, sir.className, sir.iconResId, sir.rank,
                    sir.intentAction, sir.intentTargetPackage, sir.intentTargetClass,
                    nonIndexableKeys);
        } else {
            if (TextUtils.isEmpty(sir.className)) {
                Log.w(LOG_TAG, "Cannot index an empty Search Provider name!");
                return;
            }


            final Class<?> clazz = getIndexableClass(sir.className);
            if (clazz == null) {
                Log.d(LOG_TAG, "SearchIndexableResource '" + sir.className +
                        "' should implement the " + Indexable.class.getName() + " interface!");
                return;
            }


            // Will be non null only for a Local provider implementing a
            // SEARCH_INDEX_DATA_PROVIDER field
            final Indexable.SearchIndexProvider provider = getSearchIndexProvider(clazz);//判断类中是否有SearchIndexProvider
            if (provider != null) {
                List<String> providerNonIndexableKeys = provider.getNonIndexableKeys(sir.context);
                if (providerNonIndexableKeys != null && providerNonIndexableKeys.size() > 0) {
                    nonIndexableKeys.addAll(providerNonIndexableKeys);
                }


                indexFromProvider(mContext, database, localeStr, provider, sir.className,
                        sir.iconResId, sir.rank, sir.enabled, nonIndexableKeys);
            }
        }
    }

处理逻辑如下:


可以打开数据库查看对应的项是否已添加成功,

data/user_de/0/com.android.settings/databases/search_index.db

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值