Android中PreferenceActivity使用詳解
一,Preference介紹
Android提供的preference以鍵值對的方式來處理這種情況:自動保存設(shè)置的數(shù)據(jù),并立時生效,而這種使用android sharedpreferences方式進行保存的,不需要我們手動來寫sharedpreferences;
常見的Preference控件有:
- 直接子類:DialogPreference, PreferenceGroup, RingtonePreference, TwoStatePreference
- 非直接子類:CheckBoxPreference, EditTextPreference, ListPreference, MultiSelectListPreference, PreferenceCategory, PreferenceScreen, SwitchPreference
二,PreferencesActivity介紹
是Android中專門用來實現(xiàn)程序設(shè)置界面及參數(shù)存儲的一個Activity。從Android 3.0以后官方不再推薦直接讓PreferenceActivity加載選項設(shè)置布局文件,而是建議使用PreferenceFragment(此類在API級別28中已棄用。替代類androidx庫下的PreferenceFragmentCompat,有關(guān)androidx的問題有很多,這里不過多介紹 ),二者用法類似。PreferenceActivity在API級別29中已被棄用。PreferenceActivity與普通的Activity不同,它不是使用界面布局文件,而是使用選項設(shè)置的布局文件。
PreferencesActivity官方介紹文檔:
https://developer.android.com/reference/android/preference/PreferenceActivity.html
三,PreferenceActivity的使用
3.1,在res下新建xml目錄,在xml目錄下新建PreferenceActivity需要的布局文件setting.xml(使用PreferenceScreen 最為根節(jié)點)
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<ListPreference
android:key="setting_language_preference"
android:title="語言設(shè)置"
android:entries="@array/language_entries"
android:entryValues="@array/language_values"
android:summary="支持:普通話,粵語,英語,德語,法語"
android:defaultValue="mandarin" />
<EditTextPreference
android:key="setting_preference"
android:title="連接超時"
android:dialogTitle="請輸入時間(0-10000)ms"
android:summary="默認(rèn)值1800"
android:defaultValue="1800" />
<CheckBoxPreference
android:key="@string/pref_key_translate"
android:title="Love me ?"
android:defaultValue="false" />
</PreferenceScreen>
在res/values/strings.xml文件中新建以上需要的資源數(shù)據(jù)
<string-array name="language_entries">
<item>普通話</item>
<item>粵語</item>
<item>英語</item>
<item>俄語</item>
<item>法語</item>
</string-array>
<string-array name="language_values">
<item>mandarin</item>
<item>cantonese</item>
<item>en_us</item>
<item>russian</item>
<item>french</item>
</string-array>
<string name="pref_key_translate">love_me</string>
3.2,創(chuàng)建PreferenceActivity的子類SettingActivity
public class SettingActivity extends PreferenceActivity {
public static final String PREFER_NAME = "setting";
private EditTextPreference mVadbosPreference;
@SuppressWarnings("deprecation")
public void onCreate(Bundle savedInstanceState) {
requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
getPreferenceManager().setSharedPreferencesName(PREFER_NAME);
addPreferencesFromResource(R.xml.setting);
mVadbosPreference = (EditTextPreference)findPreference("setting_preference");
}
}
3.3,運行看一下效果圖如下:

注意:運行時候,會自動在/data/data/<packagename>/shared_prefs/目錄生成一個文件名為setting文件;
四,PreferenceActivity分別和ListFragment,PreferenceFragment組合使用
PreferenceFragment官方文檔:
https://developer.android.com/reference/android/preference/PreferenceFragment
4.1,在res下新建xml目錄,在xml目錄下新建PreferenceActivity需要的布局文件activity_settings.xml(使用preference-headers
最為根節(jié)點,通過header引入Fragment)
<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android">
<header android:fragment="com.ang.demo.ui.fragment.ListFragmentSettings"
android:icon="@drawable/ic_launcher"
android:title="Settings"
android:summary="真球忙">
</header>
<header
android:fragment="com.ang.demo.ui.fragment.PreferenceFragmentTest"
android:title="PreferenceFragmentTest">
</header>
<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>
注意:header各個屬性的功能作用;
上面header引入ListFragment的子類ListFragmentSettings代碼:
public class ListFragmentSettings extends ListFragment {
protected ArrayAdapter<String> mAdapter;
protected String mData[];
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mData = getActivity().getResources().getStringArray(R.array.contries);
mAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_single_choice, mData);
setListAdapter(mAdapter);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_radio_zone_settings, container,false);
return view;
}
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
}
}
上面header引入PreferenceFragment的子類PreferenceFragmentTest代碼:
public class PreferenceFragmentTest extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
//從xml文件加載選項
addPreferencesFromResource(R.xml.fragment_preference_test);
}
}
fragment_preference_test布局文件(也是在res/xml/目錄下)
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 設(shè)置的類別 -->
<PreferenceCategory
android:key="mylocation"
android:summary="我的位置源"
android:title="我的位置">
<CheckBoxPreference
android:key="wireless_network"
android:title="使用GPS"
android:summary="使用Gps查看應(yīng)用的位置"
/>
</PreferenceCategory>
<PreferenceCategory
android:key="mymsg"
android:summary="個人信息s"
android:title="個人信息">
<EditTextPreference
android:key="myname"
android:title="請輸入真實姓名"
android:summary="姓名"/>
</PreferenceCategory>
</PreferenceScreen>
4.2,創(chuàng)建PreferenceActivity的子類PreferenceActivityTest(名字都是隨便起的)
public class PreferenceActivityTest extends PreferenceActivity {
private static List<String> fragments = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (hasHeaders()) {
Button button = new Button(this);
button.setText("Exit");
setListFooter(button);
}
}
@Override
public void onBuildHeaders(List<Header> target) {
loadHeadersFromResource(R.xml.activity_settings, target);//從xml文件加載Preference選項
fragments.clear();
for (Header header : target) {
fragments.add(header.fragment);
}
}
//android 4.3以上版本需要做驗證,驗證方式有很多 https://www.manongdao.com/article-73175.html
@Override
protected boolean isValidFragment(String fragmentName) {
return fragments.contains(fragmentName);
}
}
4.3,運行后的效果圖:

注意:ListFragment導(dǎo)入import android.app.ListFragment;別導(dǎo)入V4包下的(切記哦),如果導(dǎo)入V4包下的會出現(xiàn) java.lang.ClassCastException異常;詳細(xì)詳細(xì)異常信息:
java.lang.RuntimeException:Unable to start activity ComponentInfo{com.ang.demo/com.ang.demo.ui.activity.PreferenceActivityTest}: android.app.Fragment$InstantiationException: Trying to instantiate a class com.ang.demo.ui.fragment.ListFragmentSettings that is not a Fragment
五,Preference數(shù)據(jù)獲取
以上都是Preference的使用和保存數(shù)據(jù);如何獲取Preference的數(shù)據(jù)呢;其實和shardpreference獲取數(shù)據(jù)一樣;通過key獲取;
總結(jié)
講了這么多,其實都是 Preference的子類在PreferenceActivity和PreferenceFragment中的應(yīng)用;以上實現(xiàn)設(shè)置的功能,谷歌官方文檔推薦使用androidx包下的Preference及子類和PreferenceFragmentCompat;總是還是v4 v7 v13等support 庫遷移androidx的問題;
到此這篇關(guān)于Android中PreferenceActivity使用詳解的文章就介紹到這了,更多相關(guān)Android PreferenceActivity內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java讀寫文件,在文件中搜索內(nèi)容,并輸出含有該內(nèi)容的所有行方式
這篇文章主要介紹了Java讀寫文件,在文件中搜索內(nèi)容,并輸出含有該內(nèi)容的所有行方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08
eclipse實現(xiàn)Schnorr數(shù)字簽名
這篇文章主要為大家詳細(xì)介紹了eclipse實現(xiàn)Schnorr數(shù)字簽名,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-06-06
使用JavaWeb webSocket實現(xiàn)簡易的點對點聊天功能實例代碼
這篇文章主要介紹了使用JavaWeb webSocket實現(xiàn)簡易的點對點聊天功能實例代碼的相關(guān)資料,內(nèi)容介紹的非常詳細(xì),具有參考借鑒價值,感興趣的朋友一起學(xué)習(xí)吧2016-05-05

