用PreferenceActivity做一个标准的设置界面

最后接触到一个任务,做一个工厂设置,在我看来工厂设置不需要多美观,但是一定要方便修改,添加功能,再就是使用方便,我就想到了用PreferenceActivity,android系统的settings就是由它主导的,所以功能强大,使用方便。以平板为例,不需要复杂的设计就可以得到一个settings那样,左边是功能列表,右边是某一功能的具体选项。

public class FactorySettings extends PreferenceActivity{
public void onBuildHeaders(List<Header> target){
        this.loadHeadersFromResource(R.xml.activity_factory_settings, target);
    }
}

代码部分只需要在onBuildHeaders中添加一句loadHeadersFromResource就可以了。R.xml.activity_factory_settings这个资源文件定义在你代码res/xml/下

<?xml version="1.0" encoding="utf-8"?>
<preference-headers xmlns:android="http://schemas.android.com/apk/res/android" >

    <header android:fragment="com.example.RadioZoneSettings"
        android:title="@string/radio_zone" >
        <!--android:summary="@string/radio_zone_summary" -->
    </header> 
    
    <header android:fragment="com.example.TVSettings"
        android:title="@string/tv"
         >
         <!-- android:summary="@string/tv_summary" -->
    </header> 
    
    <header android:fragment="com.example.LogoSettings"
        android:title="@string/logo"
        >
        <!-- android:summary="@string/logo_summary"  -->
    </header> 
    
    <header android:fragment="com.example.CarTypeSettings"
        android:title="@string/cartype"
         >
         <!-- android:summary="@string/cartype_summary" -->
    </header> 
    
    <header android:fragment="com.example.ApplicationSettings"
        android:title="@string/application"
         >
         <!-- android:summary="@string/application_summary" -->
    </header> 
    
    <header android:fragment="com.example.DevelopmentSettings"
        android:title="@string/development"
         >
         <!-- android:summary="@string/development_summary" -->
    </header> 

</preference-headers>

每一对<header></header>中包含一个条目,显示在左边屏上,android:fragment指定这个条目选中时右边显示的fragment,以radiozone为例,我要在这个RadioZoneSettings中显示各个国家或者地区的频段,一个国家或者地区一行,所以这个fragment这用的是ListFragment,这的内部是一个ListView,这用这个listview显示数据供用户选择。我语言表达能力差,直接上代码吧

public class RadioZoneSettings extends ListFragment{


    protected ArrayAdapter<String> mAdapter;
    protected String mData[];
   public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated constructor stub
        super.onCreate(savedInstanceState);
        mData = getActivity().getResources().getStringArray(R.array.contries);
        mAdapter = new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_single_choice,mData);

    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        View view = inflater.inflate(R.layout.radio_tv_type, null);
        setListAdapter(mAdapter);
        return view;
    }

    public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
    //在这里恢复上次设定的值
} public void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); } }

R.array.contries是我在res/values/strings.xml中定义的一个string-array

    <string-array name="contries">
        <item name="title_china">中国</item>
        <item name="titile_Europe">欧洲</item>
        <item name="titile_usa1">美国</item>
        <item name="titile_usa2">日本</item>
        <item name="titile_euro1">俄罗斯</item>
    </string-array>

R.layout.radio_tv_type是整个ListFragment的布局文件,其实很简单,就一个ListView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

  <ListView
    android:id="@id/android:list"
    android:choiceMode="singleChoice"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1" 
    android:divider="#2f333a"
    android:dividerHeight="2dp"
    android:drawSelectorOnTop="false" />

</LinearLayout>

listview中每一个条目也是要定义一个布局文件的,本次我没有自己定义,而是使用系统提供的R.layout.simple_list_item_single_choice。

有了这些程序就可以跑起来了。其它的做法和它原理是一样的,只有过有的选项不需要用listview展示内容和选项,就需要用其它类型的fragment了,我在选择车标这个选项就碰到这问题,就是它虽然也是用listview,但是不像这里举的例子那么简单了,需要在每一项前面添加一个车的图标文件,难点有三个,一是那么多的图片,怎么添加,二是没有使用的adapter满足我自定义的item,只能自己写adapter了。还有就是如何实现单选,怎么管理状态。下一次再说。

原文地址:https://www.cnblogs.com/gelandesprung/p/4231980.html