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="默認值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異常;詳細詳細異常信息:
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獲?。?/p>
總結(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安全?ysoserial?CommonsCollections1示例解析
這篇文章主要介紹了java安全?ysoserial?CommonsCollections1示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10Java集合基礎(chǔ)知識 List/Set/Map詳解
這篇文章主要介紹了Java集合基礎(chǔ)知識 List/Set/Map,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03Spring Data Jpa Mysql使用utf8mb4編碼的示例代碼
這篇文章主要介紹了Spring Data Jpa Mysql使用utf8mb4編碼的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11Java并發(fā)編程 interrupt()方法示例詳解
interrrupt()方法可以用來打斷正在運行的線程,也可以打斷sleep()、wait()、join()情況下的線程,但是這些情況下被打斷線程的打斷標記不同,這篇文章主要介紹了Java并發(fā)編程 interrupt()方法示例詳解,需要的朋友可以參考下2023-06-06