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增加相应配置

            //优先级来确定显示位置 
            
                
            
            //值设置为新页面的类别键        
            
            //设置主界面排序,网络和互联网默认-120,只要大于即可排到第一        
            
            //跳转到Fragment  fragment也需要在SettingsGateway进行定义
            
        
  • 定义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 getXmlResourcesToIndex(
                            Context context, boolean enabled) {
                        ArrayList result =
                                new ArrayList();
    
                        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 getXmlResourcesToIndex(
                            Context context, boolean enabled) {
                        ArrayList result =
                                new ArrayList();
    
                        SearchIndexableResource sir = new                          SearchIndexableResource(context);
                        sir.xmlResId = R.xml.test_fragment; //自己配置文件名称  
                        result.add(sir);
                        //该集合中包含了xml 中定义的所有控件
                        return result;
                    }
    
    
                };
                  //如果有不希望被搜索到的空间 在getNonIndexableKeys 中进行配置
                    @Override
                    public List getNonIndexableKeys(Context context) {
                        final List keys = super.getNonIndexableKeys(context);
                        //如test_fragment.xml 中的vibration_preference_screen 控件不希望被搜索到则将其添加到 List 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));
        }
     }
    
  • 搜索只是重启无法生生效 , 需要切换一下语言才能生效

你可能感兴趣的:(Settings 中新增item , 及全局搜索)