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

今天就到这里吧,这些只是最基础的了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值