Settings 中新增item , 及全局搜索

Settings 中新增item , 及全局搜索

Android 系统应用开发时,会遇到需要在Settings中增加定制化item的需求 ,这里记录一下如何新增定制item

新增item 所需步骤


  1. 在AndroidManifest.xml增加相应配置
  2. Settings.java (com.android.settings)文件中添加相关配置
  3. SettingsActivity.java (com.android.settings)doUpdateTilesList()方法中,增加相关配置
  4. 创建点击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 **
  1. 跳转的fragment也需要在 SettingsGateway.java(com.android.settings.core.gateway)中进行配置

      private String[] ENTRY_FRAGMENTS = {
          ...
          TestFragment.class.getName(),
          ...
      }
    
  1. 定义所需的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));
        }
     }
    
  • 搜索只是重启无法生生效 , 需要切换一下语言才能生效
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 面试必背 会舍弃、总结概括——根据我这些年面试和看面试题搜集过来的知识点汇总而来 建议根据我的写的面试应对思路中的...
    luoyangzk阅读 6,805评论 6 173
  • // com.adobe.flash.listen settings.gradle 定义项目包含那些模块app.i...
    zeromemcpy阅读 1,645评论 0 1
  • 一、Java语言规范 详见:Android开发java编写规范 二、Android资源文件命名与使用 1. 【推荐...
    王朋6阅读 992评论 0 0
  • Glide的使用 Glide是google开发用于Android加载媒体的类库,包括图片,gif,video,已经...
    敖大胆阅读 7,833评论 2 17
  • Day1: 在代码中通过R.string.hello_world可以获得该字符串的引用; 在XML中通过@stri...
    冰凝雪国阅读 1,441评论 0 5