PreferenceActivity使用介绍
目錄
一,Preference介紹
二,PreferencesActivity介紹
三,PreferenceActivity的使用
四,PreferenceActivity分別和ListFragment,PreferenceFragment組合使用
五,Preference數據獲取
總結
一,Preference介紹
Android提供的preference以鍵值對的方式來處理這種情況:自動保存設置的數據,并立時生效,而這種使用android sharedpreferences方式進行保存的,不需要我們手動來寫sharedpreferences;
常見的Preference控件有:
直接子類:DialogPreference, PreferenceGroup, RingtonePreference, TwoStatePreference
非直接子類:CheckBoxPreference, EditTextPreference, ListPreference, MultiSelectListPreference, PreferenceCategory, PreferenceScreen, SwitchPreference
二,PreferencesActivity介紹
是Android中專門用來實現程序設置界面及參數存儲的一個Activity。從Android 3.0以后官方不再推薦直接讓PreferenceActivity加載選項設置布局文件,而是建議使用PreferenceFragment(此類在API級別28中已棄用。替代類androidx庫下的PreferenceFragmentCompat,有關androidx的問題有很多,這里不過多介紹?),二者用法類似。PreferenceActivity在API級別29中已被棄用。PreferenceActivity與普通的Activity不同,它不是使用界面布局文件,而是使用選項設置的布局文件。
PreferencesActivity官方介紹文檔:
https://developer.android.com/reference/android/preference/PreferenceActivity.html
三,PreferenceActivity的使用
3.1,在res下新建xml目錄,在xml目錄下新建PreferenceActivity需要的布局文件setting.xml(使用PreferenceScreen?最為根節點)
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" > <ListPreferenceandroid:key="setting_language_preference"android:title="語言設置"android:entries="@array/language_entries"android:entryValues="@array/language_values"android:summary="支持:普通話,粵語,英語,德語,法語"android:defaultValue="mandarin" /><EditTextPreferenceandroid:key="setting_preference" android:title="連接超時" android:dialogTitle="請輸入時間(0-10000)ms"android:summary="默認值1800"android:defaultValue="1800" /><CheckBoxPreferenceandroid:key="@string/pref_key_translate"android:title="Love me ?"android:defaultValue="false" /></PreferenceScreen>在res/values/strings.xml文件中新建以上需要的資源數據
<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,創建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
?最為根節點,通過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><headerandroid:fragment="com.ang.demo.ui.fragment.PreferenceFragmentTest"android:title="PreferenceFragmentTest"></header><headerandroid:icon="@mipmap/ic_launcher"android:summary="view baidu website"android:title="baidu"><intentandroid: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 {@Overridepublic void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.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"><!-- 設置的類別 --><PreferenceCategoryandroid:key="mylocation"android:summary="我的位置源"android:title="我的位置"><CheckBoxPreferenceandroid:key="wireless_network"android:title="使用GPS"android:summary="使用Gps查看應用的位置"/></PreferenceCategory><PreferenceCategoryandroid:key="mymsg"android:summary="個人信息s"android:title="個人信息"><EditTextPreferenceandroid:key="myname"android:title="請輸入真實姓名"android:summary="姓名"/></PreferenceCategory></PreferenceScreen>?4.2,創建PreferenceActivity的子類PreferenceActivityTest(名字都是隨便起的)
public class PreferenceActivityTest extends PreferenceActivity {private static List<String> fragments = new ArrayList<String>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);if (hasHeaders()) {Button button = new Button(this);button.setText("Exit");setListFooter(button);}}@Overridepublic 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@Overrideprotected boolean isValidFragment(String fragmentName) {return fragments.contains(fragmentName);} }4.3,運行后的效果圖:
?注意:ListFragment導入import?android.app.ListFragment;別導入V4包下的(切記哦),如果導入V4包下的會出現??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數據獲取
以上都是Preference的使用和保存數據;如何獲取Preference的數據呢;其實和shardpreference獲取數據一樣;通過key獲取;
總結
講了這么多,其實都是?Preference的子類在PreferenceActivity和PreferenceFragment中的應用;以上實現設置的功能,谷歌官方文檔推薦使用androidx包下的Preference及子類和PreferenceFragmentCompat;總是還是v4 v7 v13等support?庫遷移androidx的問題;
總結
以上是生活随笔為你收集整理的PreferenceActivity使用介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [css] 为什么说对opacity进行
- 下一篇: [vue-element]Element