前言: 最近忙著搞項目,難得有時間,便來整理搞項目中學習到的知識 使用之前,先介紹一下android這種的五種數據儲存方式,分別為文件儲存,SharePrefence,SQL,使用ContentProvider存儲數據,網路存儲數據,其中,SharePrefence是一個輕量的儲存,主要是用來儲存a ...
前言:
最近忙著搞項目,難得有時間,便來整理搞項目中學習到的知識
使用之前,先介紹一下android這種的五種數據儲存方式,分別為文件儲存,SharePrefence,SQL,使用ContentProvider存儲數據,網路存儲數據,其中,SharePrefence是一個輕量的儲存,主要是用來儲存app的相關設置,設置界面就是使用的這種儲存方式
想要深入瞭解的請看下麵的參考博文
Android 數據存儲五種方式使用與總結 - CSDN博客
使用:
按照以往,我們創建界面的時候,是用的xml佈局+activity文件,設置界面也是與之類似
第一步:創建xml文件夾
切換到Project模式,新建一個xml文件夾,用來放設置界面的佈局文件
第二步:編寫佈局文件
在xml文件夾中新建一個xml文件
命名的話以pref_xxx形式,官方的命名規範就是以pref為首碼命名的
打開xml文件,可以發現與我們之前寫佈局文件是一樣的,有design模式和text模式,這裡我們可以看到有七種可以選擇,我只講解EditTextPreference和SwitichPreference
需要詳解的可以參考這一篇Android:詳解如何創建Google風格的SettingsActivity - 簡書
結合上面的兩張圖片,我講解一下相關的屬性
defaultValue是預設值,
key類似於我們寫layout文件中定義的id,我們可以通過id找到控制項,同樣的,在這裡,我們也可以通過key可以找到控制項
summary就是開通會員下麵的那一行字
title就是標題,也就是開通會員
EditViewPreference 這個是封裝了EditView的一個控制項,當我們點擊的時候,會彈出一個對話框讓我們輸入數據,當我們輸入數據之後,數據就會保存在SharePreference之中
同理,switch是一個開關,點擊的時候會將true或者false保存在SharePreference中
如果我們只是想弄一個選項,點擊會打開一個瀏覽器,上面的控制項均不合適,我們怎麼辦呢?不知道你註意到沒有,最外層使用的是PreferenceScreen
我們可以像上圖之中這樣使用PreferenceScreen,之後在java代碼之中可以為它設置監聽器,跳轉到瀏覽器
key可以定義在sting.xml中,當然,也可以直接設置
第三步:創建Fragment
對於Android 3.0以下的應用,我們需要在 Activity 中顯示設置,應當擴展 PreferenceActivity 類。這是傳統 Activity 類的擴展,該類根據 Preference 對象的層次結構顯示設置列表。當用戶進行更改時,PreferenceActivity 會自動保留與每個 Preference 相關的設置。對 Android 3.0 及 更高版本系統的應用,則應改為使用 PreferenceFragment。與僅使用上述 Activity 相比,無論在構建何種 Activity,Fragment都可為應用提供一個更加靈活的體繫結構。 現在來說,最低版本都是android4.0了,我們就直接拋棄以前的方法,使用Fragment即可新建一個Fragment
由於我們這個是設置界面,所以不需要想正常的fragment那樣使用,所以將三個選項都取消
首先我們要修改fragment,使其繼承PreferenceFragment
之後,在onCreate方法中添加一行代碼,使用addPreferenceFromResource方法綁定之前的設置界面的xml
如果之前有使用過fragment的,應該知道我們只能在onViewCreated方法中來找控制項
這裡通過key來找到設置界面的控制項
調用靜態方法getDefaultSharedPreference來獲得sharePreference,之後通過get方法來獲取之前保存的數值
這裡需要提及一下,原本的SharedPreference中可以保存int boolean String等類型的數據,但是,如果像我們這裡使用設置來保存app設置的相關數據,sharedPreference只有兩種數據,一種是String,另外一種則是boolean,如果想要int,需要將獲得的String轉換為int類型
找到控制項之後,我們可以調用相關的方法為其設置監聽器來實現相關的功能
第四步:動態添加在framelayout中
我們需要新建一個activity文件,其佈局需要一個framelayout
之後,我們通過Fragment的方法動態添加設置fragment
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.add(R.id.setting_framlayout,settingFragment).commit();
學過fragment的話,應該知道,我們使用Fragment的時候,有兩個包給我們選擇,一個是v4包,另外一個則是app包,使用v4包的那個fragment可以獲得更好的相容性(低版本)
所以這裡需要註意,使用的fragment是app包的Fragment,剛開始我使用的v4包,一直出錯,查找原因之後,發現了,之前settingFragment繼承的是PreferenceFragment,而PreferenceFragment繼承的則是app包下的Fragment
補充:
通過setEnable方法(對象為控制項)可以禁用控制項(如果設置密碼鎖的話可以使用此方法)
可以將Preference轉型為相關的對象,如Preference可以轉為EditTextPreference,或者可以轉為SwitchPreference,之後就可以調用相關的對象的方法(與原來的在xml定義的控制項相同的使用方法)