android设置搜索功能,Android源码学习——Android L中系统设置的搜索功能

这篇博客讲述了在Android系统设置中遇到的一个bug,即无法搜索到‘触碰付款’选项。通过分析代码,发现在数据库初始化时,缺少了该搜索项。问题在于search_indexable_resources类中未正确加载数据。解决方案包括更新数据库版本以触发重建,添加对应XML文件,或者在类中实现Indexable并定义SEARCH_INDEX_DATA_PROVIDER。调试时需注意数据库重建过程。
摘要由CSDN通过智能技术生成

目的及问题由来

前几天在rendmine上收到一个bug任务,在系统设置中搜索,搜索不到“触碰付款”这一项。

于是需要查看设置中搜索这部分功能并进行修改解决这个bug。

找到问题代码位置package/apps/Settings/src/com/android/settings/search/IndexDateBaseHelper.java

查看部分代码对问题进行分析

发现这部分功能是通过将数据初始化到数据库文件中,在date/date/com.android.setings/datebases/search_index.db我们可以导出手机中的数据库文件进行查看,可以发现确实缺少了我们需要的“触碰付款”。

找到数据库初始化代码的位置

我们可以发现系统设置对数据项的构建是在searchIndexableResources类中。

对照此类中的其他搜索项的加载方式,例如“wifi设置”和“wifi高级项”sResMap.put(WifiSettings.class.getName(),

new SearchIndexableResource(

Ranking.getRankForClassName(WifiSettings.class.getName()),//需要在Ranking类中添加对应的项

NO_DATA_RES_ID,

WifiSettings.class.getName(),

R.drawable.ic_settings_wireless));

sResMap.put(AdvancedWifiSettings.class.getName(),

new SearchIndexableResource(

Ranking.getRankForClassName(AdvancedWifiSettings.class.getName()),

R.xml.wifi_advanced_settings,

AdvancedWifiSettings.class.getName(),

R.drawable.ic_settings_wireless)

);

加载需要解析的xml文件的搜索项

我们发现连段代码有一点轻微的差别,“NO_DATA_RES_ID”表示此搜索项匹配没有需要解析的xml文件,“R.xml.wifi_advanced_settings”表示需要加载和解析对应的xml文件中的title,只要搜索对应的title机会将链接到此xml的界面,此xml的解析在Index.java中if (!nodeName.equals(NODE_NAME_CHECK_BOX_PREFERENCE)) {

summary = getDataSummary(context, attrs);

String entries = null;

if (nodeName.endsWith(NODE_NAME_LIST_PREFERENCE)) {

entries = getDataEntries(context, attrs);

}

// Insert rows for the child nodes of PreferenceScreen

updateOneRowWithFilteredData(database, localeStr, title, summary, null, entries,

fragmentName, screenTitle, iconResId, rank,

keywords, intentAction, intentTargetPackage, intentTargetClass,

true, key, -1 /* default user id */);

} else {

String summaryOn = getDataSummaryOn(context, attrs);

String summaryOff = getDataSummaryOff(context, attrs);

if (TextUtils.isEmpty(summaryOn) && TextUtils.isEmpty(summaryOff)) {

summaryOn = getDataSummary(context, attrs);

}

updateOneRowWithFilteredData(database, localeStr, title, summaryOn, summaryOff,

null, fragmentName, screenTitle, iconResId, rank,

keywords, intentAction, intentTargetPackage, intentTargetClass,

true, key, -1 /* default user id */);

}

加载NO_DATA_RES_ID的搜索项

对于没有xml的“NO_DATA_RES_ID”那么就需要其会使其类中实现(implement)Indexable并在其类中定义名称为:SEARCH_INDEX_DATA_PROVIDER的SearchIndexProvider,在其中会定义加载那些设置项。

注意

在调试阶段由于这段代码是在数据库初始化的时候执行的,所以我们调试代码的时候请将数据库的版本号+1,这样数据库就会重新构建我们添加或修改的代码才会被执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值