Preference 能簡便地實現設置界面,且主要優點是設置的值會自動通過 SharedPreferences 方式保存下來,可直接取用。
一、簡易實現
res/xml/prefs.xml:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceCategory
android:title="顯示一排偏好">
<CheckBoxPreference
android:key="checkbox_preference"
android:title="開關偏好1"
android:summary="這是一個開關按鈕1" />
<SwitchPreference
android:key="switch_preference"
android:title="開關偏好2"
android:summary="這是一個開關按鈕2" />
</PreferenceCategory>
<PreferenceCategory
android:title="基于對話框的偏好">
<EditTextPreference
android:key="edittext_preference"
android:title="文本輸入偏好"
android:summary="使用一個文本框對話框"
android:dialogTitle="輸入你的寵物" />
<ListPreference
android:key="list_preference"
android:title="列表偏好"
android:summary="使用一個列表對話框"
android:entries="@array/entries_list_preference"
android:entryValues="@array/entryvalues_list_preference"
android:dialogTitle="選擇一個" />
<MultiSelectListPreference
android:title="多選列表偏好"
android:key="multiSelectList_preference"
android:summary="使用一個多選列表對話框"
android:entries="@array/entries_list_preference"
android:entryValues="@array/entryvalues_list_preference"
android:dialogTitle="選擇幾個" />
</PreferenceCategory>
<PreferenceCategory
android:title="啟動偏好">
<PreferenceScreen
android:key="screen_preference"
android:title="屏幕"
android:summary="顯示另一個偏好屏幕">
<!-- You can place more preferences here that will be shown on the next screen. -->
<CheckBoxPreference
android:key="next_screen_checkbox_preference"
android:title="開關偏好"
android:summary="另一個屏幕上的偏好" />
</PreferenceScreen>
<PreferenceScreen
android:title="意圖偏好1"
android:summary="通過意圖啟動一個Activity">
<intent
android:targetClass="com.ttt.zhihudaily.activity.FavouriteActivity"
android:targetPackage="com.ttt.zhihudaily"/>
</PreferenceScreen>
<PreferenceScreen
android:title="意圖偏好2"
android:summary="通過意圖啟動一個鏈接">
<intent android:action="android.intent.action.VIEW"
android:data="http://www.baidu.com" />
</PreferenceScreen>
</PreferenceCategory>
<PreferenceCategory
android:title="偏好屬性">
<CheckBoxPreference
android:key="parent_checkbox_preference"
android:title="父開關"
android:summary="這是一個父開關" />
<CheckBoxPreference
android:key="child_checkbox_preference"
android:dependency="parent_checkbox_preference"
android:layout="?android:attr/preferenceLayoutChild"
android:title="子開關"
android:summary="這是一個子開關" />
</PreferenceCategory>
</PreferenceScreen>
res/values/array.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="entries_list_preference">
<item>a</item>
<item>b</item>
<item>c</item>
<item>d</item>
<item>e</item>
</string-array>
<string-array name="entryvalues_list_preference">
<item>1</item>
<item>2</item>
<item>3</item>
<item>4</item>
<item>5</item>
</string-array>
</resources>
PrefsFragment:
package com.ttt.zhihudaily.fragment;
import android.os.Bundle;
import android.preference.PreferenceFragment;
import com.ttt.zhihudaily.R;
public class PrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
}
}
- Activity 中的 addPreferencesFromResource() 已經廢棄,現在都推薦用 Fragment。
PrefsActivity:
package com.ttt.zhihudaily.activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MenuItem;
import com.ttt.zhihudaily.R;
import com.ttt.zhihudaily.fragment.PrefsFragment;
public class PrefsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_prefs);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
* getFragmentManager()
* .beginTransaction()
* .replace(R.id.prefs_frame,new PrefsFragment())
* .commit();
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()){
case android.R.id.home:
finish();
break;
default:
break;
}
return true;
}
}
二、獲取設置值
prefs.xml 中有設置 android:key 屬性,就可以通過這個 key 從 SharedPreferences 中取值。其他 Activity 或 Fragment 等都可以這樣取到值。
public class PrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(getActivity());
Boolean checkbox=prefs.getBoolean("checkbox_preference",false);
Toast.makeText(getActivity(), ""+checkbox, Toast.LENGTH_SHORT).show();
}
}
三、設置點擊事件和值改變事件
package com.ttt.zhihudaily.fragment;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
import android.preference.Preference;
import android.preference.PreferenceFragment;
import android.preference.PreferenceManager;
import android.preference.SwitchPreference;
import android.widget.CheckBox;
import android.widget.Toast;
import com.ttt.zhihudaily.R;
public class PrefsFragment extends PreferenceFragment
implements Preference.OnPreferenceChangeListener,Preference.OnPreferenceClickListener{
private SharedPreferences prefs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.prefs);
prefs=PreferenceManager.getDefaultSharedPreferences(getActivity());
CheckBoxPreference cp=(CheckBoxPreference)findPreference("checkbox_preference");
SwitchPreference sp=(SwitchPreference)findPreference("switch_preference");
cp.setOnPreferenceClickListener(this);
sp.setOnPreferenceChangeListener(this);
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
Toast.makeText(getActivity(), "開關按鈕2的值是:"+newValue, Toast.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onPreferenceClick(Preference preference) {
Boolean checkboxValue=prefs.getBoolean(preference.getKey(),false);
Toast.makeText(getActivity(), "開關按鈕1的值是:"+checkboxValue, Toast.LENGTH_SHORT).show();
return true;
}
}
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。