美文网首页
Settings 中新增item , 及全局搜索

Settings 中新增item , 及全局搜索

作者: 呵呵豆 | 来源:发表于2021-09-30 11:51 被阅读0次

    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));
          }
       }
      
    • 搜索只是重启无法生生效 , 需要切换一下语言才能生效

    相关文章

      网友评论

          本文标题:Settings 中新增item , 及全局搜索

          本文链接:https://www.haomeiwen.com/subject/sccenltx.html