android preference-headers 属性,Android开发之PreferenceActivity的使用
PreferenceActivity
在開發應用程序時,有時我們會有選項設置界面,通常我們可以使用SharePreference以鍵值對的形式進行保存。Android為我們提供了PreferenceActivity。PreferencesActivity是Android中專門用來實現程序設置界面及參數存儲的一個Activity。
我們只要把Activity繼承PreferenceActivity, PreferenceActivity會幫我們處理選項的讀寫。從Android3.0開始,官方不推薦單獨使用PreferenceActivity,而是建議PreferenceActivity與PreferenceFragment結合使用。
PreferenceActivity結合PreferenceFragment實現選項設置
官方建議PreferenceActivity與PreferenceFragment結合使用,其中PreferenceActivity負責加載選項配置列表的布局文件,PreferenceFragment負責加載選項配置的布局文件。
在res下創建xml目錄來創建布局
例如:
PreferenceActivity加載的布局如下,不是layout,而是preference-headers。
res/xml/pref_headers.xml
android:fragment="com.rair.preferenceactivitydemo.PreferenceActivityWithPreferenceFragment$GeneralPreferenceFragment"
android:icon="@drawable/ic_info_black_24dp"
android:title="@string/pref_header_general" />
我們可以通過android:fragment來指定啟動PreferenceFragment,當然了,也可以通過Intent來啟動指定Activity。
android:icon="@drawable/ic_info_black_24dp"
android:title="@string/pref_header_general">
android:action="android.intent.action.VIEW"
android:data="https://www.baidu.com" />
Activity:
public class PreferenceActivityWithPreferenceFragment extends AppCompatPreferenceActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void onBuildHeaders(List target) {
//加載選項列表布局
loadHeadersFromResource(R.xml.pref_headers, target);
}
/**
* 驗證Preference是否有效
*
* @param fragmentName
* @return
*/
protected boolean isValidFragment(String fragmentName) {
return true;
}
/**
* GeneralPreferenceFragment
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public static class GeneralPreferenceFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.pref_general);
}
}
}
PreferenceActivity負責加載選項配置列表的布局文件
preference-headers根標簽相當于一個列表,header標簽相當于每個Item。
如下:
PreferenceFragment負責加載選項配置的布局文件
res/xml/pref_general.xml
android:capitalize="words"
android:defaultValue="@string/pref_default_display_name"
android:inputType="textCapWords"
android:key="example_text"
android:maxLines="1"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="@string/pref_title_display_name" />
android:summary="么么噠"
android:title="Rair" />
如下:
完成效果如下:
我們來看看提供了哪幾種布局元素可供使用
1.CheckBoxPreference:CheckBox選擇項,對應的值的ture或flase。如圖:
2.EditTextPreference:輸入編輯框,值為String類型,會彈出對話框供輸入。
3.ListPreference: 列表選擇,彈出對話框供選擇。
4.Preference:只進行文本顯示,需要與其他進行組合使用。
5.PreferenceCategory:用于分組。效果如下:
6.PreferenceScreen:PreferenceActivity的根元素。
7.RingtonePreference:系統鈴聲選擇。
8.MultiSelectListPreference:列表選擇(多選)
9.SwitchPreference:Switch
接著上面,PreferenceFragment布局修改如下:
res/xml/pref_general.xml布局
android:checked="true"
android:title="不再提醒" />
android:capitalize="words"
android:defaultValue="@string/pref_default_display_name"
android:inputType="textCapWords"
android:key="example_text"
android:maxLines="1"
android:selectAllOnFocus="true"
android:singleLine="true"
android:title="@string/pref_title_display_name" />
android:dialogTitle="城市"
android:entries="@array/city"
android:entryValues="@array/country"
android:title="列表" />
android:summary="么么噠"
android:title="Rair" />
android:entries="@array/city"
android:entryValues="@array/country"
北京
上海
廣州
深圳
A
B
C
D
效果如圖:
PreferenceCategory屬性:
key:唯一標識(至少在同一程序中是唯一),SharedPreferences也將通過此Key值進行數據保存,也可以通過key值獲取保存的信息。
title:顯示標題(大字體顯示)
summary:副標題(小字體顯示)
defaultValue:默認值
dependency:附屬,即標識此元素附屬于某一個元素(通常為CheckBoxPreference),dependency值為所附屬元素的key。當CheckPreference值為true時,Preference則為可用,否則為不可用。
dialogTitle:彈出對話框的標題
entries:列表中顯示的值。為一個數組,通常通過資源文件進行設置。
entryValues:列表中實際保存的值,與entries對應。(上面的city和county)
寫個例子
例子直接用的Activity結合PreferenceFragment實現
我們用PreferenceScreen來實現下圖布局
res/xml/pref_my.xml布局
android:key="one"
android:summary="配置全局應用設置"
android:title="應用" />
android:key="two"
android:summary="配置編輯器"
android:title="編輯器" />
android:key="three"
android:summary="配置全局應用設置"
android:title="應用" />
android:key="four"
android:summary="配置代碼風格"
android:title="代碼風格" />
android:key="five"
android:summary="配置構建運行設置"
android:title="構建運行" />
android:key="six"
android:summary="配置Dropbox同步設置"
android:title="Dropbox" />
android:key="seven"
android:summary="配置Git版本控制"
android:title="Git版本控制" />
android:key="eight"
android:summary="顯示法律相關信息"
android:title="法律" />
MyFragment:
public class MyFragment extends PreferenceFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getPreferenceManager().setSharedPreferencesMode(MODE_WORLD_READABLE);
addPreferencesFromResource(R.xml.pref_my);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Preference one = findPreference("one");
one.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "one", Toast.LENGTH_SHORT).show();
return true;
}
});
findPreference("two").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "two", Toast.LENGTH_SHORT).show();
return true;
}
});
findPreference("three").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "再點一下試試", Toast.LENGTH_SHORT).show();
return true;
}
});
findPreference("four").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "試試就試試", Toast.LENGTH_SHORT).show();
return true;
}
});
}
}
Activity:
public class ActivityWithPreferenceFragment extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_with_preference_fragment);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fl, new MyFragment()).commit();
}
}
開篇有說到Preference以鍵值對的形式進行保存,所以我給每一項設置了一個key。這個的作用和我們常用的id差不多,一會如果我們要引用這個組件可以通過key來找到他。
我們來加幾個點擊事件
OnPreferenceClickListener 用來監聽某個選項是否被點擊
public class MyFragment extends PreferenceFragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getPreferenceManager().setSharedPreferencesMode(MODE_WORLD_READABLE);
addPreferencesFromResource(R.xml.pref_my);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Preference one = findPreference("one");
one.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "one", Toast.LENGTH_SHORT).show();
return true;
}
});
findPreference("two").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "two", Toast.LENGTH_SHORT).show();
return true;
}
});
findPreference("three").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "再點一下試試", Toast.LENGTH_SHORT).show();
return true;
}
});
findPreference("four").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "試試就試試", Toast.LENGTH_SHORT).show();
return true;
}
});
}
}
通過key找到對應組件
findPreference("two").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Toast.makeText(getActivity(), "two", Toast.LENGTH_SHORT).show();
return true;
}
});
運行一下:
總結
以上是生活随笔為你收集整理的android preference-headers 属性,Android开发之PreferenceActivity的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [css] 你有使用过css的属性bac
- 下一篇: [js] js怎样避免原型链上的对象共