国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

詳解Android首選項框架的使用實例

2019-12-12 04:37:23
字體:
來源:轉載
供稿:網友

首選項這個名詞對于熟悉Android的朋友們一定不會感到陌生,它經常用來設置軟件的運行參數。

Android提供了一種健壯并且靈活的框架來處理首選項。它提供了簡單的API來隱藏首選項的讀取和持久化,并且提供了一個優雅的首選項界面。

首先,我們來看下面這款軟件的首選項界面:

這款軟件使用了好幾種類型的首選項,每一種首選項都有其獨特的用法,下面我們來了解一下幾種常見的首選項:

  • CheckBoxPreference:用來打開或關閉某個功能
  • ListPreference:用來從多個選項中選擇一個值;
  • EditTextPreference:用來配置一段文字信息;
  • Preference:用來執行相關的自定義操作(上圖中的清除緩存、歷史記錄、表單、cookie都屬于此項);
  • RingtonePreference:專門用來為用戶設置鈴聲。

當我們使用首選項框架時,用戶每更改一項的值后,系統就會立即在/data/data/[PACKAGE_NAME]/shared_prefs下生成一個[PACKAGE_NAME]_preferences.xml的文件,文件會記錄最新的配置信息。

那么如何使用首選想框架呢?我們需要以下幾步操作:

1.建立一個首選項的xml配置文件,放在項目的/res/xml目錄下面;

2.新建一個Activity,繼承android.preference.PreferenceActivity,然后在onCreate方法中加載我們的首選項配置文件。

下面,我就為大家演示一下首選項框架的配置和使用:

我們新建一個prefs項目,項目結構如下:

我們要實現的功能跟上面那款軟件的很相似,下面我來說明一下這個項目的整體流程:

1.主界面。顯示用戶昵稱,有三個參數,昵稱文字、字體大小和背景顏色。首次進入時,使用默認值。

2.按下menu鍵中的settings項,跳轉到首選項頁面,進行參數選擇。

3.按下返回鍵,返回主界面,設定后的參數生效。

首先,讓我們來看一下主界面的配置文件,非常簡單,就一個TextView:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   android:orientation="vertical"   android:layout_width="fill_parent"   android:layout_height="fill_parent">   <TextView     android:id="@+id/textView"     android:layout_width="fill_parent"     android:layout_height="fill_parent"     android:gravity="center_horizontal"     android:textColor="#FF0000"/> </LinearLayout> 

然后,我們需要在主界面里根據配置參數設置TextView的外觀以及背景,MainActivity.java代碼如下:

package com.scott.prefs;  import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.graphics.Color; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.TextView;  public class MainActivity extends Activity {    private static final int SETTINGS_ID = 0;   private static final int EXIT_ID = 1;    private TextView textView;    @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);     textView = (TextView) findViewById(R.id.textView);     showSettings();   }    @Override   public boolean onCreateOptionsMenu(Menu menu) {     super.onCreateOptionsMenu(menu);     menu.add(0, SETTINGS_ID, 0, "Settings");     menu.add(0, EXIT_ID, 0, "Quit");     return true;   }    @Override   public boolean onOptionsItemSelected(MenuItem item) {     if (item.getItemId() == SETTINGS_ID) {       Intent intent = new Intent(MainActivity.this, PrefsActivity.class);       //如果requestCode >= 0 則返回結果時會回調 onActivityResult()方法       startActivityForResult(intent, 1);     } else {       finish();     }     return true;   }    @Override   protected void onActivityResult(int requestCode, int resultCode, Intent data) {     super.onActivityResult(requestCode, resultCode, data);     showSettings();   }    private void showSettings() {     String prefsName = getPackageName() + "_preferences";  //[PACKAGE_NAME]_preferences     SharedPreferences prefs = getSharedPreferences(prefsName, Context.MODE_PRIVATE);      String nickName = prefs.getString("nickName", "機器人");     textView.setText("歡迎您:" + nickName);      boolean nightMode = prefs.getBoolean("nightMode", false);     textView.setBackgroundColor(nightMode ? Color.BLACK : Color.WHITE);      String textSize = prefs.getString("textSize", "0");     if (textSize.equals("0")) {       textView.setTextSize(18f);     } else if (textSize.equals("1")) {       textView.setTextSize(22f);     } else if (textSize.equals("2")) {       textView.setTextSize(36f);     }   } } 

可以看到,進入主界面之后會根據[PACKAGE_NAME]_preferences獲取首選項配置信息,如果是首次進入,則使用默認值,下面就是我們首次進入主界面時的畫面:

可以看到,我們初次進入的界面時昵稱為“機器人”,字的背景為白色,字的大小為18號。

然后按下Settings之后,我們就可以進行首選項的配置了,讓我們先來看一下settings.xml的配置:

<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"   android:key="settings"   android:title="軟件設置">   <PreferenceCategory     android:key="basic"     android:title="基本設置">     <EditTextPreference       android:key="nickName"       android:title="昵稱"       android:defaultValue="機器人"/>     <CheckBoxPreference       android:key="nightMode"       android:title="夜間模式"       android:summaryOn="已啟用"       android:summaryOff="未啟用"/>     <ListPreference       android:key="textSize"       android:title="文字大小"       android:dialogTitle="文字大小"       android:entries="@array/textSize_entry"       android:entryValues="@array/textSize_entry_value"       android:defaultValue="0"/>   </PreferenceCategory>   <PreferenceCategory     android:key="clean"     android:title="清除記錄">     <Preference        android:key="cleanHistory"       android:title="清除歷史記錄" />     </PreferenceCategory> </PreferenceScreen> 

其中,最外層是PreferenceScreen標簽,代表一系列首選項的集合;然后,我們注意到PreferenceCategory這一項,此標簽代表一個類別,可以包含多個首選項;最后就是我們用于配置參數的首選項了。需要了解的是,PreferenceScreen也可以嵌套使用,也就是說上面的PreferenceCategory可以替換成PreferenceScreen。

此外,我們還需要了解一下文件中出現的幾個常用標簽屬性:

  • android:key  選項的名稱或鍵
  • android:title  選項的標題
  • android:summary  選項的簡短摘要
  • android:entries  列表項的文本
  • android:entryValues  列表中每一項的值
  • android:dialogTitle  對話框標題
  • android:defalutValue  列表中選項的默認值
  • 對于CheckBoxPreference還有兩個特殊的屬性
  • android:summaryOn  選項被選中時顯示的摘要
  • android:summaryOff  選項未選中時顯示的摘要

我們還可以看到,在ListPreference中,entries來自于textSize_entry,而entryValues來自于textSize_entry_value,這兩項都在/res/values目錄下的text_size.xml配置:

<?xml version="1.0" encoding="utf-8"?> <resources>   <string-array name="textSize_entry">     <item>小</item>     <item>中</item>     <item>大</item>   </string-array>   <string-array name="textSize_entry_value">     <item>0</item>     <item>1</item>     <item>2</item>   </string-array> </resources> 

配置完成之后,我們就剩下最后一步了,創建Activity,繼承PreferenceActivity,加載首選項資源文件,處理相應的選項事件。

PrefsActivity.Java代碼如下:

package com.scott.prefs;  import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.preference.EditTextPreference; import android.preference.ListPreference; import android.preference.Preference; import android.preference.PreferenceActivity; import android.preference.PreferenceScreen; import android.widget.Toast;  public class PrefsActivity extends PreferenceActivity implements Preference.OnPreferenceChangeListener {    private EditTextPreference nickName;   private ListPreference textSize;   private Preference cleanHistory;    @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     addPreferencesFromResource(R.xml.setttings);     nickName = (EditTextPreference) findPreference("nickName");     textSize = (ListPreference) findPreference("textSize");     cleanHistory = findPreference("cleanHistory");      //為nickName和textSize注冊Preference.OnPreferenceChangeListener監聽事件     //當值更改時我們可以立即更新summary     nickName.setOnPreferenceChangeListener(this);     textSize.setOnPreferenceChangeListener(this);      initSummary();   }    //初始化summary   private void initSummary() {     nickName.setSummary(nickName.getText());      setTextSizeSummary(textSize.getValue());   }    private void setTextSizeSummary(String textSizeValue) {     if (textSizeValue.equals("0")) {       textSize.setSummary("小");     } else if (textSizeValue.equals("1")) {       textSize.setSummary("中");     } else if (textSizeValue.equals("2")) {       textSize.setSummary("大");     }   }    /**    * 重寫PreferenceActivity的onPreferenceTreeClick方法    * 在首選項被點擊時 做出相應處理操作    */   @Override   public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {     if (preference == cleanHistory) {       new AlertDialog.Builder(this)           .setTitle("清除歷史記錄")           .setMessage("是否真的要清除歷史記錄?")           .setPositiveButton("是", new DialogInterface.OnClickListener() {             @Override             public void onClick(DialogInterface dialog, int which) {               //cleaning history...               Toast.makeText(PrefsActivity.this, "清除成功", Toast.LENGTH_SHORT).show();             }           }).setNegativeButton("否", new DialogInterface.OnClickListener() {         @Override         public void onClick(DialogInterface dialog, int which) {           dialog.dismiss();         }       }).create().show();     }     return true;   }    /**    * 重寫Preference.OnPreferenceChangeListener的onPreferenceChange方法    * 當首選項的值更改時 做出相應處理操作    */   @Override   public boolean onPreferenceChange(Preference preference, Object newValue) {     if (preference == nickName) {       nickName.setSummary(newValue.toString());     } else if (preference == textSize) {       setTextSizeSummary(newValue.toString());     }     return true;   } } 

最后,別忘了在AndroidManifest.xml中加入此Activity配置信息:

<activity android:name=".PrefsActivity"/> 

當然我們也可以配置一下<intent-filter></intent-filter>屬性。

經過以上幾步,我們的首選項配置就完成了,首次進入的界面如下:
然后我們分別更改昵稱、夜間模式、文字大小,如下:
可以看到,當我們更改了選項的值之后,摘要部分已經設置為最新值了,此時在我們應用下的shared_prefs目錄中生成一個com.scott.prefs_preferences.xml文件,如圖:

內容如下:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map>   <boolean name="nightMode" value="true" />   <string name="nickName">scott</string>   <string name="textSize">2</string> </map> 

此時,我們按回退鍵,回到主界面,發現剛才的設置已經生效了:

可以看到,昵稱已經更改成“scott”,字的背景已更改為黑色,字的大小已更改為36號。

如果我們在首選項界面按下清除歷史記錄一項,將會出現一下界面:

原文鏈接:http://blog.csdn.net/liuhe688/article/details/6448423

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鹰潭市| 三原县| 含山县| 绥阳县| 和林格尔县| 盐城市| 罗江县| 德州市| 内丘县| 汝南县| 南宫市| 南平市| 天等县| 宕昌县| 潞城市| 平阳县| 黄梅县| 贵阳市| 略阳县| 洛隆县| 阿图什市| 乌鲁木齐市| 抚远县| 海伦市| 越西县| 成都市| 乐业县| 永泰县| 营口市| 九龙县| 玉环县| 邯郸市| 永顺县| 新源县| 沾化县| 旌德县| 福州市| 新安县| 六安市| 汾阳市| 柳河县|