Android设置界面之Preference

作者: CoderMiner | 来源:发表于2016-10-28 17:23 被阅读5867次

    Android设置界面之Preference

    题图 www.gratisography.com

    Android系统为设置界面的UI提供了一系列的接口,设置界面的部分和Activity是分离的,会有一个PreferenceScreen的对象
    是根目录,在其中会包含CheckBoxPreference EditTextPreference ListPreference PreferenceCategory RingtonePreference

    • 相关的接口

      Preference.OnPreferenceChangeListener
      Preference.OnPreferenceClickListener
      PreferenceFragment.OnPreferenceStartFragmentCallback
      PreferenceManager.OnActivityDestroyListener
      PreferenceManager.OnActivityResultListener
      PreferenceManager.OnActivityStopListener
      
    • 相关的类

      CheckBoxPreference
      DialogPreference
      EditTextPreference
      ListPreference
      MultiSelectListPreference
      Preference
      Preference.BaseSavedState
      PreferenceActivity
      PreferenceActivity.Header
      PreferenceCategory
      PreferenceFragment
      PreferenceGroup
      PreferenceManager
      PreferenceScreen
      RingtonePreference
      SwitchPreference
      TwoStatePreference
      

    概述

    由于设置的界面是使用Preference而不是View来创建的,需要特殊的Activity或者Fragment的子类来显示

    • 版本低于Android 3.0(API 10),请使用PreferenceActivity
    • 版本高于Android 3.0(API 10),可以在普通的Activity中使用PreferenceFragment来显示,也可以使用PreferenceActivity

    在XML中定义Preference

    可以在运行时创建Preference也可以通过在xml中定义Preference,每一个Preference的子类都可以用XML中的元素来定义,在 res/xml/
    文件夹中创建一个文件如preference.xml

    如果想定义分屏的设置布局,需要分别定义XML

    preference.xml一般的布局如下:

    <?xml version="1.0" encoding="utf-8"?>
    <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
        <CheckBoxPreference
            android:key="pref_sync"
            android:title="@string/pref_sync"
            android:summary="@string/pref_sync_summ"
            android:defaultValue="true" />
        <ListPreference
            android:dependency="pref_sync"
            android:key="pref_syncConnectionType"
            android:title="@string/pref_syncConnectionType"
            android:dialogTitle="@string/pref_syncConnectionType"
            android:entries="@array/pref_syncConnectionTypes_entries"
            android:entryValues="@array/pref_syncConnectionTypes_values"
            android:defaultValue="@string/pref_syncConnectionTypes_default" />
    </PreferenceScreen>
    

    创建PreferenceActivity

    • 定义xml文件

      res/xml/文件夹中定义 preference.xml

      <?xml version="1.0" encoding="utf-8"?>
      <PreferenceScreen
          xmlns:android="http://schemas.android.com/apk/res/android">
          <PreferenceCategory
              android:title="@string/inline_preferences">
              <CheckBoxPreference
                  android:key="check_box_pref"
                  android:title="@string/title_checkbox_preference"
                  android:summary="@string/summary_checkbox_preference">
                  .....
              </CheckBoxPreference>
          </PreferenceCategory>
      </PreferenceScreen>
      
    • Activity继承PreferenceActivity

      public class SettingsActivity1 extends PreferenceActivity{
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          addPreferencesFromResource(R.xml.preference); //API 10之后的版本这个方法以及过时,推荐使用Fragment的方式
        }
      
      }
      

    使用Preference Fragments

    在高于Android 3.0(API 10)的版本,应该使用PreferenceFragment来显示Preference,就不需要继承PreferenceActivity
    继承PreferenceFragmentonCreate()方法中调用addPreferencesFromResource()方法

    public class SettingsFragment extends PreferenceFragment{
    
      @Override
      public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          this.addPreferencesFromResource(R.xml.preference);
      }
    
    }
    

    创建一个Activity,然后将定义的Fragments添加到当前的Activity中,最终呈现的效果和PreferenceActivity是一样的

    public class SettingsActivity2 extends Activity{
    
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          this.getFragmentManager().beginTransaction()
              .replace(android.R.id.content, new SettingsFragment())
              .commit();
      }
    
    }
    
    • 显示新条目
    <PreferenceCategory
        android:title="@string/dialog_based_preferences">
      <!-- 添加对应的preference 如PreferenceScreen EditTextPreference 等-->
    </PreferenceCategory>
    
    • list view preference
    <ListPreference
      android:key="list_preference"
      android:title="@string/title_list_preference"
      android:summary="@string/summary_list_preference"
      android:entries="@array/entries_list_preference"
      android:entryValues="@array/entryvalues_list_preference"
      android:dialogTitle="@string/dialog_title_list_preference"/>
    
    • 输入框
    <EditTextPreference
              android:key="edit_preference"
              android:title="@string/title_edittext_preference"
              android:summary="@string/summary_edittext_preference"
              android:dialogTitle="@string/dialog_title_edittext_preference"
              />
    

    使用Preference Header

    • 为每一个设置文件单独创建一个PreferenceFragment的实例
    • 创建headers的XML文件,在fragment中设置对应的PreferenceFragment的实例
    • 使用PreferenceActivity
    • 实现obBuildHeaders()方法
    <?xml version="1.0" encoding="utf-8"?>
    <preference-headers
      xmlns:android="http://schemas.android.com/apk/res/android">
      <header
          android:fragment="com.example.demo.preference$PrefsFragment1"
          android:title="Pref 1"
          android:summary="An example of some preferences.">
    
      </header>
      <header
          android:fragment="com.example.demo.preference$PrefsFragment2"
          android:title="Pref 2"
          android:summary="Another example of some preferences.">
    
      </header>
      <extra android:name="test" android:value="testvalue" />
    </preference-headers>
    

    <extras>元素中的内容,可以通过Bundle获得,通过方法getArguments()获取

    显示headers使用PreferenceActivity的回调方法onBuildHeaders()加载preference-headers.xml文件

    @Override
    public void onBuildHeaders(List<Header> target) {
        super.onBuildHeaders(target);
        loadHeadersFromResource(R.xml.preference_header, target);
    }
    

    自定义Preference的布局

    通过Preference的属性android:layout=""设置自定义的layout文件

    相关文章

      网友评论

      • Xdjm:可以,很详细
      • 69fcaf845dd7:Your content must have a ListView whose id attribute is 'android.R.id.list'
        我写一个设置界面的时候运行出现了这样的错误:broken_heart: 怎么破
        69fcaf845dd7:@CodeMiner 这是SettingsFragment的代码
        public class SettingsFragment extends PreferenceFragment{
        @Override
        public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.addPreferencesFromResource(R.xml.preferences);
        }

        }
        69fcaf845dd7:@CodeMiner 抱歉这么晚才回复,这是SettingsActivity的代码
        public class SettingsActivity extends PreferenceActivity {
        private SettingsFragment mSettingsFragment;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);
        if (savedInstanceState==null){
        mSettingsFragment=new SettingsFragment();
        replaceFragment(R.id.settings_container,mSettingsFragment);
        }


        }


        public void replaceFragment(int viewId,android.app.Fragment fragment){
        FragmentManager fragmentManager=getFragmentManager();
        fragmentManager.beginTransaction().replace(viewId,fragment).commit();
        }


        }
        CoderMiner: @天蝎_dbb9 具体是要实现什么功能,有没有代码?

      本文标题:Android设置界面之Preference

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