Android中PreferenceActivity使用詳解
一,Preference介紹
Android提供的preference以鍵值對的方式來處理這種情況:自動(dòng)保存設(shè)置的數(shù)據(jù),并立時(shí)生效,而這種使用android sharedpreferences方式進(jìn)行保存的,不需要我們手動(dòng)來寫sharedpreferences;
常見的Preference控件有:
- 直接子類:DialogPreference, PreferenceGroup, RingtonePreference, TwoStatePreference
- 非直接子類:CheckBoxPreference, EditTextPreference, ListPreference, MultiSelectListPreference, PreferenceCategory, PreferenceScreen, SwitchPreference
二,PreferencesActivity介紹
是Android中專門用來實(shí)現(xiàn)程序設(shè)置界面及參數(shù)存儲(chǔ)的一個(gè)Activity。從Android 3.0以后官方不再推薦直接讓PreferenceActivity加載選項(xiàng)設(shè)置布局文件,而是建議使用PreferenceFragment(此類在API級別28中已棄用。替代類androidx庫下的PreferenceFragmentCompat,有關(guān)androidx的問題有很多,這里不過多介紹 ),二者用法類似。PreferenceActivity在API級別29中已被棄用。PreferenceActivity與普通的Activity不同,它不是使用界面布局文件,而是使用選項(xiàng)設(shè)置的布局文件。
PreferencesActivity官方介紹文檔:
https://developer.android.com/reference/android/preference/PreferenceActivity.html
三,PreferenceActivity的使用
3.1,在res下新建xml目錄,在xml目錄下新建PreferenceActivity需要的布局文件setting.xml(使用PreferenceScreen 最為根節(jié)點(diǎn))
<?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="連接超時(shí)" android:dialogTitle="請輸入時(shí)間(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,運(yùn)行看一下效果圖如下:
注意:運(yùn)行時(shí)候,會(huì)自動(dòng)在/data/data/<packagename>/shared_prefs/目錄生成一個(gè)文件名為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é)點(diǎn),通過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各個(gè)屬性的功能作用;
上面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文件加載選項(xiàng) 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="個(gè)人信息s" android:title="個(gè)人信息"> <EditTextPreference android:key="myname" android:title="請輸入真實(shí)姓名" 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選項(xiàng) fragments.clear(); for (Header header : target) { fragments.add(header.fragment); } } //android 4.3以上版本需要做驗(yàn)證,驗(yàn)證方式有很多 https://www.manongdao.com/article-73175.html @Override protected boolean isValidFragment(String fragmentName) { return fragments.contains(fragmentName); } }
4.3,運(yùn)行后的效果圖:
注意:ListFragment導(dǎo)入import android.app.ListFragment;別導(dǎo)入V4包下的(切記哦),如果導(dǎo)入V4包下的會(huì)出現(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ù)呢;其實(shí)和shardpreference獲取數(shù)據(jù)一樣;通過key獲?。?/p>
總結(jié)
講了這么多,其實(shí)都是 Preference的子類在PreferenceActivity和PreferenceFragment中的應(yīng)用;以上實(shí)現(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安全?ysoserial?CommonsCollections1示例解析
這篇文章主要介紹了java安全?ysoserial?CommonsCollections1示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10用java生成html文件實(shí)現(xiàn)原理及代碼
用printStream來向html文件里輸出數(shù)據(jù),先創(chuàng)建一個(gè)StringBuilder對象,通過append方法來為其添加html語句,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下,希望對大家有所幫助2013-08-08Java集合基礎(chǔ)知識 List/Set/Map詳解
這篇文章主要介紹了Java集合基礎(chǔ)知識 List/Set/Map,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Spring Data Jpa Mysql使用utf8mb4編碼的示例代碼
這篇文章主要介紹了Spring Data Jpa Mysql使用utf8mb4編碼的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11Java Excel文件加密保護(hù)數(shù)據(jù)安全
這篇文章主要為大家介紹了Java Excel文件加密保護(hù)數(shù)據(jù)安全的方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Java并發(fā)編程 interrupt()方法示例詳解
interrrupt()方法可以用來打斷正在運(yùn)行的線程,也可以打斷sleep()、wait()、join()情況下的線程,但是這些情況下被打斷線程的打斷標(biāo)記不同,這篇文章主要介紹了Java并發(fā)編程 interrupt()方法示例詳解,需要的朋友可以參考下2023-06-06SpringBoot錯(cuò)誤處理機(jī)制以及自定義異常處理詳解
這篇文章主要為大家詳細(xì)介紹了SpringBoot錯(cuò)誤處理機(jī)制以及自定義異常處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05Java?GUI實(shí)現(xiàn)多個(gè)窗口切換效果
這篇文章主要為大家詳細(xì)介紹了Java?GUI實(shí)現(xiàn)多個(gè)窗口的切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04