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;
}
});
今天就到這裏吧,這些只是最基礎的了。