編輯:關於Android編程
首選項這個名詞對於熟悉Android的朋友們一定不會感到陌生,它經常用來設置軟件的運行參數。
Android提供了一種健壯並且靈活的框架來處理首選項。它提供了簡單的API來隱藏首選項的讀取和持久化,並且提供了一個優雅的首選項界面。
首先,我們來看下面這款軟件的首選項界面:
這款軟件使用了好幾種類型的首選項,每一種首選項都有其獨特的用法,下面我們來了解一下幾種常見的首選項:
當我們使用首選項框架時,用戶每更改一項的值後,系統就會立即在/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。
此外,我們還需要了解一下文件中出現的幾個常用標簽屬性:
我們還可以看到,在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
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持本站。
RecycleView出來已經有一兩個年頭了最近在項目中完全替換掉了ListView很有必要的寫一篇記錄一下使用過程,以便以後溫故而知新。RecycleView的使用場景
查看Android應用(apk)簽名 在微博、微信開放平台注冊應用時,需要填寫應用(apk)的簽名,可以使用keytool工具找
篇外話:先來說下今天的日期,今天是2015年02月18日也就是大年三十,大家都在歡歡喜喜的准備過大年,活動也各式各樣,搓麻將、打撲克、放煙花、准備看春晚,而我卻還在敲代碼
華為榮耀於8月1號下午正式發布了6.6吋大屏手機華為榮耀NOTE8,那麼想要購買新機的朋友是不是很想知道華為榮耀note8怎麼預約購買呢?下面小編就馬上帶來