Android 系统应用-设置-搜索功能问题集

本文详细列举了在Android系统应用中设置搜索功能时遇到的五个问题,包括使用Java代码和注解添加搜索、数据库数据无法显示、key值不同导致搜索失败、搜索结果不显示主路径以及如何使其他apk在设置中显示。同时提供了验证修改是否生效的方法和数据库操作技巧。
摘要由CSDN通过智能技术生成

目录

 

一、介绍

二、验证修改生效与否的方法以及相关操作

三、问题集

1.使用Java代码和注解添加进搜索

2.数据库里有数据,但无法搜索出来

3.key值不同,搜索不出结果

4.搜索出来的结果不显示主路径(xml文件解析):

5.另一个apk如何在设置里搜索显示出来,并显示设置的路径

附件:SearchIndexablesContract.java


一、介绍

本文是建立在,设置的搜索功能模块代码正常的基础上的。设置公共的搜索功能模块代码,后面有空会出专门的文章分析。其实本文第五个问题(5.另一个apk如何在设置里搜索显示出来,并显示设置的路径)已经教给大家如何去写数据库的方法,只不过设置做成了一个公共的搜索功能模块代码,通过注解,解析xml文件,java代码等来维护数据库)。

二、验证修改生效与否的方法以及相关操作

1.修改之后push apk到手机,然后在设置更多设置里面选择恢复出厂设置

adb push C:\Users\Administrator\Desktop\Settings.apk ./product/priv-app/Settings/

2.获取目标位置:adb shell pm path com.android.settings

/product/priv-app/Settings/Settings.apk

3.从手机里pull出来db数据库文件:

adb pull /data/data/com.android.settings.intelligence/databases/search_index.db

三、问题集

1.使用Java代码和注解添加进搜索

添加@SearchIndexable并加上下列代码:

/**

* For Search.

*/

public static final com.android.settings.search.BaseSearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new com.android.settings.search.BaseSearchIndexProvider() {

@Override

public List<android.provider.SearchIndexableResource> getXmlResourcesToIndex(

Context context, boolean enabled) {

final android.provider.SearchIndexableResource sir = new android.provider.SearchIndexableResource(context);

sir.xmlResId = R.xml.zen_mode_settings;

return Arrays.asList(sir);

}

@Override

public List<com.android.settings.search.SearchIndexableRaw> getRawDataToIndex(

Context context, boolean enabled) {

final List<com.android.settings.search.SearchIndexableRaw> result = new ArrayList<>();

final android.content.res.Resources res = context.getResources();

com.android.settings.search.SearchIndexableRaw data1 =

new com.android.settings.search.SearchIndexableRaw(context);

data1.title = res.getString(R.string.zen_mode_starting_time_title);

data1.screenTitle = res.getString(R.string.zen_mode_settings_title);

data1.keywords = res.getString(R.string.zen_mode_starting_time_title);

data1.key = KEY_START_TIME;

result.add(data1);

com.android.settings.search.SearchIndexableRaw data2 =

new com.android.settings.search.SearchIndexableRaw(context);

data2.title = res.getString(R.string.zen_mode_end_time);

data2.screenTitle = res.getString(R.string.zen_mode_settings_title);

data2.keywords = res.getString(R.string.zen_mode_end_time);

data2.key = KEY_END_TIME;

result.add(data2);

return result;

}

};


2.数据库里有数据,但无法搜索出来

1)这是因为出现了重复的id,此时会根据该id最后一次的数据库操作,来写入enabled的数据,不确定性很强。(有时候能显示,有时候不能显示)

该id出现在多个页面里,把不需要的页面的屏蔽即可。

示例:

允许通话:(zen_mode_calls)

是在ZenModePriorityCallsPreferenceController里来控制此id(zen_mode_calls)

而ZenModePriorityCallsPreferenceController在两个文件里有调用:

1.ZenModeSoundVibrationSettings(需要显示的页面)

2.ZenModeCallsSettings(原生界面)

问题出现在ZenModeCallsSettings这个页面中:

它的isPageSearchEnabled方法把enable自动置为0,所以无法搜索出来,如果把它的返回值写为true,则在搜索的时候有可能搜索出来原生的界面,而无需要显示的界面,所以最终的修改方案为,不让此页面写入数据库:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值