Android實戰之PreferenceActivity使用詳解

一、寫作前面

當我們做應用的時候,需要用戶配置一些信息,而這就是通常所說的應用設置。

對於Android系統來說,系統本身的設置帶來的用戶體驗和習慣已經深入人心,在我們的應用中同樣用到類似的設置頁,

那麼用戶使用起來就會更加親切和方便。是嗎?那我們應該怎麼做到呢?這就要靠本文的主人公PreferenceActivity瞭。

二、設置的細節

打開Android手機的設置,如下圖:

我們會看到整個頁面被分為幾組:無線網絡、設備、個人、賬戶和系統。這個分組(或者叫分類)就是PreferenceCategory。

Wifi右邊有開關,這一項就是CheckBoxPreference;其他還有ListPreference和EditTextPreference。

你的每一次設置,都會被Preference存下來,這就是setting的數據持久化。

三、如何實現自己的設置

下面我們來實現一個設置程序,看看PreferenceActivity的基本知識都有哪些。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分成兩組(PreferenceCategory),First Category和Second Category.

每一個Preference中的都會包含一個key(android:key),它的功能相當於普通layout中的id。

title:這一項的標題,字體比較大。

summary:摘要,標題下面的文字,字體較小。

defaultValue:為設置summary之前的默認值。

其中數組list_preference在array.xml中定義:


    
        Red
        Blue
        Green  
    

Setting中是怎樣加入這些UI信息呢?

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);
    }

此時,這個setting類就可以運行起來瞭。其實就是這麼簡單。也許你會問,我們設置瞭自己的偏好值,程序中如何獲得呢?

我們需要註冊一個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;
	}

}

完整代碼在此:HowToPreferenceActivity

發佈留言