Settings 中新增item , 及全局搜索
Android 系统应用开发时,会遇到需要在Settings中增加定制化item的需求 ,这里记录一下如何新增定制item
新增item 所需步骤
- 在AndroidManifest.xml增加相应配置
- 在
Settings.java (com.android.settings)
文件中添加相关配置 - 在
SettingsActivity.java (com.android.settings)
的doUpdateTilesList()
方法中,增加相关配置 - 创建点击item后需要跳转的fragment
- 在AndroidManifemst.xml增加相应配置
<activitytest
//TestSettingsActivity 需要在Settings(com.android.settings)中进行定义
android:name="Settings$TestSettingsActivity"
android:label="test" //新增条目title
android:icon="@drawable/test" //新增条目所需图标
android:taskAffinity="com.android.settings"
android:parentActivityName="Settings">
//优先级来确定显示位置
<intent-filter android:priority="-8">
<action android:name="com.android.settings.action.SETTINGS"/>
</intent-filter>
//值设置为新页面的类别键
<meta-data android:name="com.android.settings.category"
android:value="com.android.settings.category.ia.system"/>
//设置主界面排序,网络和互联网默认-120,只要大于即可排到第一
<meta-data android:name="com.android.settings.order" android:value="8"/>
//跳转到Fragment fragment也需要在SettingsGateway进行定义
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.sprd.settings.TestFragment"/>
</activity>
-
定义Activity
需要在Settings(com.android.settings)中进行定义, 即上面AndroidManifemst 中配置的TestSettingsActivity
public class Settings extends SettingsActivity {
...
public static class TestSettingsActivity extends SettingsActivity { /* empty */ }
...
}
- SettingsActivity.java (com.android.settings)
的
doUpdateTilesList()`方法中,增加相关配置
/**
* Add for Smart Controls
*@{
*/
somethingChanged = setTileEnabled(changedList, new ComponentName(packageName,
Settings.TestSettingsActivity.class.getName()),
true /*false则隐藏,true显示*/, isAdmin)
|| somethingChanged;
- 在SettingsGateway 中增加配置
Settings.TestSettingsActivity.class.getName(),
- **创建点击item后需要跳转的fragmen **
-
跳转的fragment也需要在 SettingsGateway.java(com.android.settings.core.gateway)中进行配置
private String[] ENTRY_FRAGMENTS = { ... TestFragment.class.getName(), ... }
-
定义所需的fragment
public class TestFragment extends DashboardFragment implements Indexable{ private static final String TAG = "AicyDisplaySettings"; @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); } @Override public void onResume() { super.onResume(); } @Override public int getMetricsCategory() { return SettingsEnums.LOCATION_SCANNING; } //Fragment 的对应布局 @Override protected int getPreferenceScreenResId() { return R.xml.test_fragment } @Override protected String getLogTag() { return TAG; } /** * For Search. */ public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider() { @Override public List<SearchIndexableResource> getXmlResourcesToIndex( Context context, boolean enabled) { ArrayList<SearchIndexableResource> result = new ArrayList<SearchIndexableResource>(); SearchIndexableResource sir = new SearchIndexableResource(context); sir.xmlResId = R.xml.test_fragment; result.add(sir); return result; } }; }
关于新增item的搜索
-
需要Fragment 实现Indexable 接口重写 getXmlResourcesToIndex 方法 , 以上你面TestFragment 为例
public class TestFragment extends DashboardFragment implements Indexable{ /** * For Search. */ public static final Indexable.SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider() { @Override public List<SearchIndexableResource> getXmlResourcesToIndex( Context context, boolean enabled) { ArrayList<SearchIndexableResource> result = new ArrayList<SearchIndexableResource>(); SearchIndexableResource sir = new SearchIndexableResource(context); sir.xmlResId = R.xml.test_fragment; //自己配置文件名称 result.add(sir); //该集合中包含了xml 中定义的所有控件 return result; } }; //如果有不希望被搜索到的空间 在getNonIndexableKeys 中进行配置 @Override public List<String> getNonIndexableKeys(Context context) { final List<String> keys = super.getNonIndexableKeys(context); //如test_fragment.xml 中的vibration_preference_screen 控件不希望被搜索到则将其添加到 List<String> keys 中即可 keys.add("vibration_preference_screen"); return keys; } }
-
在SearchIndexableResources 进行配置
public final class SearchIndexableResources { static { sResMap.put(AicyDisplaySettings.class.getName(), new SearchIndexableResource( 0, NO_DATA_RES_ID, TestFragment.class.getName(), -1)); } }
- 搜索只是重启无法生生效 , 需要切换一下语言才能生效