Android學習筆記1 PreferenceActivity和PreferenceFragment實現(xiàn)設置界面

前言

我們在進行Android開發(fā)的過程中,有時需要實現(xiàn)一個設置界面,就像下面的系統(tǒng)的顯示設置。這樣的界面自己實現(xiàn)起來略顯繁瑣,好在Android中已經(jīng)實現(xiàn)了這樣的設置界面,那就是PreferenceActivity。并且PreferenceActivity還有一個莫大的好處,配置信息會自動使用SharedPreferences進行保存,無需我們自己實現(xiàn)。

顯示設置

使用方法

如果我們有許多類設置項,我們可以把設置分頁。將PreferenceActivityPreferenceFragment結合使用,其中PreferenceActivity只是負責加載選項設置列表的布局文件。

  • 配置選項設置列表
    選項設置列表需要通過xml文件進行配置,現(xiàn)在res目錄下新建xml目錄,建立preference_home.xml文件。使用preference-headers作為根節(jié)點,配置內(nèi)容為
    <?xml version="1.0" encoding="utf-8"?>
    <preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
    
        <header
            android:fragment="com.sunny.handlertest.MyPreferenceActivity$Prefs1Fragment"
            android:icon="@mipmap/ic_launcher"
            android:summary="設置第一個參數(shù)"
            android:title="設置1" />
    
        <header
            android:fragment="com.sunny.handlertest.MyPreferenceActivity$Pref2Fragment"
            android:icon="@mipmap/ic_launcher"
            android:summary="設置第二個參數(shù)"
            android:title="設置2" />
    
        <header
            android:icon="@mipmap/ic_launcher"
            android:summary="view baidu website"
            android:title="baidu">
            <intent
                android:action="android.intent.action.VIEW"
                android:data="https://m.baidu.com/" />
        </header>
    
    </preference-headers>
    

我們?yōu)槊恳豁?code>header設置點擊后的fragment路徑,標題,圖標等。并且可以加入intent,如第三個header,點擊以后會打開百度的網(wǎng)站。
下面來編寫代碼,新建一個類MyPreferenceActivity并繼承PreferenceActivity。實現(xiàn)兩個靜態(tài)內(nèi)部類,繼承PreferenceFragment。
onCreate中,我們可以利用setListFooter()給界面設置一個底部按鈕之類的東西。
要想加載配置文件,需要重寫onBuildHeaders()方法,并使用loadHeadersFromResource(R.xml.preference_home, target)來加載我們的配置文件。
需要注意的是,在Android 4.4及以上的的版本中,還要實現(xiàn)isValidFragment()方法,否則會有運行時錯誤,這個回調函數(shù),會傳遞給我們fragment類的路徑,我們要判斷是否是有效路徑,如果是,就返回true。在這里為了簡單,直接返回true。

public class MyPreferenceActivity extends PreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (hasHeaders()) {
            Button button = new Button(this);
            button.setText("Exit");
            setListFooter(button);
        }
    }

    @Override
    protected boolean isValidFragment(String fragmentName) {
        System.out.println(fragmentName);
        return true;
    }

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

    public static class Prefs1Fragment extends PreferenceFragment {

    }

    public static class Pref2Fragment extends PreferenceFragment {

    }

}  

這一步實現(xiàn)的效果如圖


選項設置列表
  • 配置詳細設置
    新建一個配置文件preference_frag1.xml,設置根節(jié)點為PreferenceScreen,代碼如下
  <?xml version="1.0" encoding="utf-8"?>
  <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
  
      <PreferenceCategory android:title="設置組1">
          <EditTextPreference
              android:dialogTitle="輸入您的名字"
              android:key="name"
              android:singleLine="true"
              android:summary="設置您的姓名"
              android:title="姓名" />
  
          <ListPreference
              android:dialogTitle="選擇性別"
              android:entries="@array/sex_name"
              android:entryValues="@array/sex_value"
              android:key="sex"
              android:summary="選擇您的性別"
              android:title="性別" />
      </PreferenceCategory>
  
      <PreferenceCategory android:title="設置組2">
  
          <CheckBoxPreference
              android:defaultValue="true"
              android:key="isOk"
              android:summaryOff="關閉"
              android:summaryOn="打開"
              android:title="推送" />
  
          <SwitchPreference
              android:defaultValue="false"
              android:key="autoRun"
              android:summaryOff="關"
              android:summaryOn="開"
              android:title="自啟動" />
      </PreferenceCategory>
  
  </PreferenceScreen>

其中PreferenceCategory用于設置分組;EditTextPreference是含有EditText的對話框;ListPreference是含有單選列表的對話框;CheckBoxPreference是單選項;SwitchPreference是開關。
需要注意如下幾點,每一項要設置一個key,這是每一個設置的鍵,在代碼中,可以通過這個鍵找到對應的Preference。ListPreference要配置entriesentryValues這兩個屬性,是數(shù)組類型,分別代表顯示出來的選項和存儲的值,代碼如下

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="sex_name">
        <item>男</item>
        <item>女</item>
    </string-array>

    <string-array name="sex_value">
        <item>1</item>
        <item>0</item>
    </string-array>
</resources>

配置好后,我在在Prefs1FragmentonCreate方法中使用addPreferencesFromResource(R.xml.preference_frag1)就可以載入我們的配置文件啦。通過findPreference()方法,還可以找到key對應的配置。完整代碼如下

    public static class Prefs1Fragment extends PreferenceFragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preference_frag1);

            String name = ((EditTextPreference) findPreference("name")).getText();
            Toast.makeText(getActivity(), name, Toast.LENGTH_SHORT).show();
        }
    }

效果如圖所示


詳細設置

再說幾句

這是寫的第一篇讀書筆記,以后還會慢慢更新的,努力學習ing
不早了,晚安~o( ̄▽ ̄)ブ**

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容