android中的Settings

android中的Settings


這個星期,妹子被安排學習android中Settings App的學習,其實我開發工作類似於android的framework的開發,對上層的UI不是很熟悉,可是沒辦法,硬着頭皮上。
這個我看的android是4.0以上的,其系統實現的settings app是使用的header+fragment來實現的,就是程序啓動的Activity中的那些項目是一個一個的header,你和一個一個的fragment是一一對應的,點擊header就會使用這個fragment來替換當前activity的content,來實現這個項目的設置項,那麼先來看怎麼來定義header和fragment之間的對應關係。
header和fragment的對應關係定義可以通過一個xml文件來描述,如下:

<preference-headers xmlns:android="http://schemas.android.com/apk/res/android" >

    <header
        android:id="@+id/wlan"
        android:fragment="com.example.settings.WlanSettingsFragment"
        android:icon="@drawable/ic_settings_wifi"
        android:title="@string/wlan" />

</preference-headers>

我們定義一個header,我們可以指定其各項的屬性,最關鍵的是fragment這個參數,其就是點擊這個header後跳轉到的這個fragment,我們這個是WlanSettingsFragment
我們爲了提供一些靈活性,做了一個基類SettingsFragment,其定義如下:

public class SettingsFragment extends PreferenceFragment {
       public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
       }

}

PreferenceFragment可以用來顯示各個Preference.
WlanSettingsFragment繼承至SettingsFragment,如下:

public class WlanSettingsFragment extends SettingsFragment {

       public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
            addPreferencesFromResource(R.xml.wlan_settings);
       }
}

關係這個Fragment我們需要顯示怎麼樣的preference,我們可以使用xml文件來加載。
一個fragment的preference描述如下:

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:settings="http://schemas.android.com/apk/res/com.android.settings"
    android:title="@string/wlan" >

    <Preference
        style="?android:preferenceInformationStyle"
        android:key="kernel_version"
        android:summary="@string/device_info_default"
        android:title="@string/kernel_version" />

    <SwitchPreference 
        android:key="wifi_open"
        android:title="@string/wifi_enable"
        android:defaultValue="false"
        />

</PreferenceScreen>

preference可以自動的使用SharePreferences完成數據的保存,其保存的形式是一個鍵值對形式,那麼這個key就是在描述preference中的android:key的值。

下面一步就是啓動Activity,爲了顯示header,我們繼承PreferenceActivity類實現我們的主Activity。如下:

public class SettingsActivity extends PreferenceActivity {

    @Override
    public void onBuildHeaders(List<Header> target) {
        loadHeadersFromResource(R.xml.settings_headers, target);
    }

    @Override
    protected boolean isValidFragment(String fragmentName) {
        // TODO Auto-generated method stub
        if (fragmentName.equals("com.example.settings.WlanSettingsFragment")) {
            return true;
        }
        return false;
    }

}

開始看google的開發文檔,原文如下:


Note: When using preference headers, your subclass of PreferenceActivity doesn’t need to implement
the onCreate() method, because the only required task for the activity is to load the headers.


就是你只要在onBuildHeaders方法中,加載你定義的headers文件就ok了,可是在我的4.4.2的手機上就是運行不起來,好吧,然後看了手機的崩潰報告,說一定要實現isValidFragment這個方法,判斷一下header中的fragment的參數是否是正確的。
然後就運行起來了。

然後爲了響應一些preference的點擊啊,狀態改變啊,我們可以通過findPreference在fragment中找出在xml定義的preference,這個函數的參數就是在xml文件中定義的android:key的值。然後我們可以給它添加操作。
如下:

SwitchPreference wifiopen = (SwitchPreference) findPreference("wifi_open");
        wifiopen.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

            public boolean onPreferenceChange(Preference preference, Object newValue) {
                // TODO Auto-generated method stub
                boolean open = (boolean) newValue;
                if (open) {
                    openwifi();
                } else {
                    closewifi();
                }
                return true;
            }
        });

今天就到這裏吧,這些只是最基礎的了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章