編輯:關於Android編程
當我們做應用的時候,需要用戶配置一些信息,而這就是通常所說的應用設置。
對於Android系統來說,系統本身的設置帶來的用戶體驗和習慣已經深入人心,在我們的應用中同樣用到類似的設置頁,
那麼用戶使用起來就會更加親切和方便。是嗎?那我們應該怎麼做到呢?這就要靠本文的主人公PreferenceActivity了。
打開Android手機的設置,如下圖:

我們會看到整個頁面被分為幾組:無線網絡、設備、個人、賬戶和系統。這個分組(或者叫分類)就是PreferenceCategory。
Wifi右邊有開關,這一項就是CheckBoxPreference;其他還有ListPreference和EditTextPreference。
你的每一次設置,都會被Preference存下來,這就是setting的數據持久化。
下面我們來實現一個設置程序,看看PreferenceActivity的基本知識都有哪些。<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ytfPyNKqy7W1xMrHo6xQcmVmZXJlbmNlQWN0aXZpdHm000FQSSBsZXZlbDHW0L7NvNPI68HLo6zEx8O0uvPQ+NfUQW5kcm9pZDMuMLrz09DBy0ZyYWdtZW50tcS4xcTuo6zNrMqx0rK0+MC0wctQcmVmZXJlbmNlRnJhZ21lbnSjrNXiyse687uwo6y98czsztLDx8/IvbK9srzytaW1xKGjPC9wPgo8cD7V4rj2wP3X09PQwb249kFjdGl2aXR51+mzyaOstdrSu7j2ysdNYWluQWNpdGl2aXR5o6yzzNDyxvS2r7rz1rG907W9tMujrNPDwLTP1sq1U2V0dGluZ9bQtcS498/uyejWw8TayN2ju7Xatv649srHU2V0dGluZ6OsvMyz0NfUUHJlZmVyZW5jZUFjdGl2aXR5o6zVucq+yOe6zsno1sO6zcr9vt205rSistnX97XIoaPO0ta7ysfP69Hdyr5QcmVmZXJlbmNlQWN0aXZpdHnP4LnYtcTWqsq2o6xVScrH1rG9083QtcSjrGxheW91dNbQ0rLTw8HLSGFyZGNvZGWjrMfrv7S52da7ysfIocbkvqu7qqOoyOe5+9PQtcS7sKOpo6zIpcbk1OPGyaGjPC9wPgo8cD4xLlNldHRpbmc8L3A+CjxwPs/IwLTLtcu11tjNt8+3UHJlZmVyZW5jZUFjdGl2aXR5o6zL/LKisrvP8cbVzai1xEFjdGl2aXR5xMfR+dPDbGF5b3V0wLTX9tfUvLq1xL3nw+ajrMv8ysfTw9eoyvS1xHhtbC9wcmVmZXJlbmNlLnhtbMC0ubm9qNfUvLq1xL3nw+ajrMi7uvPU2sDg1tC808jrtMt4bWyhozwvcD4KPHA+sb7A/dHdyr7I/dbWs6PTw3ByZWZlcmVuY2WjrMjnz8K0+sLro7o8L3A+CjxwPnByZWZlcmVuYy54bWw8L3A+CjxwPjxwcmUgY2xhc3M9"brush:java;">
每一個Preference中的都會包含一個key(android:key),它的功能相當於普通layout中的id。
title:這一項的標題,字體比較大。
summary:摘要,標題下面的文字,字體較小。
defaultValue:為設置summary之前的默認值。
其中數組list_preference在array.xml中定義:
Setting中是怎樣加入這些UI信息呢?- Red
- Blue
- Green
public class Setting extends PreferenceActivity implements OnSharedPreferenceChangeListener {
private EditTextPreference mEtPreference;
private ListPreference mListPreference;
private CheckBoxPreference mCheckPreference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
initPreferences();
}
private void initPreferences() {
mEtPreference = (EditTextPreference)findPreference(Consts.EDIT_KEY);
mListPreference = (ListPreference)findPreference(Consts.LIST_KEY);
mCheckPreference = (CheckBoxPreference)findPreference(Consts.CHECKOUT_KEY);
}我們需要注冊一個Preference變化的Listener來監聽這些事件。當我們做好設置後,Preference已經替我們做好了數據持久化了。
我們可以用sharedPreference來獲得這些值。
下面來看:
@Override
protected void onResume() {
super.onResume();
// Setup the initial values
SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();
mListPreference.setSummary(sharedPreferences.getString(Consts.LIST_KEY, ""));
mEtPreference.setSummary(sharedPreferences.getString(Consts.EDIT_KEY, "linc"));
// Set up a listener whenever a key changes
sharedPreferences.registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
// Unregister the listener whenever a key changes
getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(Consts.EDIT_KEY)) {
mEtPreference.setSummary(
sharedPreferences.getString(key, "20"));
} else if(key.equals(Consts.LIST_KEY)) {
mListPreference.setSummary(sharedPreferences.getString(key, ""));
}
}
}到此,setting的功能就實現了。那麼,在其他Activity中如何獲得設置的值呢?也是用sharedPreference來實現:
看看我的MainActivity:
package com.linc.howtopreferenceactivity;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button btnSetting,btnShow;
private TextView tvCheckout,tvList,tvEditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
btnSetting = (Button)findViewById(R.id.btn_setting);
btnShow = (Button)findViewById(R.id.btn_show);
btnSetting.setOnClickListener(buttonListener);
btnShow.setOnClickListener(buttonListener);
tvCheckout = (TextView)findViewById(R.id.tv_checkout);
tvList = (TextView)findViewById(R.id.tv_list);
tvEditText = (TextView)findViewById(R.id.tv_edittext);
}
private OnClickListener buttonListener = new OnClickListener() {
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.btn_setting:
startActivity(new Intent(MainActivity.this,Setting.class));
break;
case R.id.btn_show:
showSettingInfo();
break;
}
}
};
private void showSettingInfo() {
SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this);
tvCheckout.setText(settings.getBoolean(Consts.CHECKOUT_KEY, false)+"");
tvEditText.setText(settings.getString(Consts.EDIT_KEY, ""));
tvList.setText(settings.getString(Consts.LIST_KEY, "linc"));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Android使用WindowManager構造懸浮view
一般在android顯示一個View都是通過Activity的setContentView設置的,但是還有一種方法,可以直接使用WindowManager在整個應用的最上
安卓開發中內存問題分析(一)工具篇
內存洩漏和內存溢出是安卓開發中經常碰到的問題,如何能夠快速有效的發現並追蹤內存洩漏或者內存溢出的源頭,是每個開發者都需要掌握的技巧,今天我給大家帶來常見的內存分析工具使用
Android Theme and style
每家公司的app都有自己的統一的特色,這就涉及到theme和style,當然他們只不是僅僅為了這個特點存在,想activity的進入動畫等都能通過theme和style實
Android開發筆記(一百一十二)開發工具
Eclipse/ADTADT是Google在Eclipse基礎上封裝了Android開發工具的環境,最新版本是2014年7月2日發布的adt-bundle-windows