您的位置:首页 > 移动开发 > Android开发

android中的Settings

2015-08-01 09:22 645 查看

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


今天就到这里吧,这些只是最基础的了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: