标签:
最后接触到一个任务,做一个工厂设置,在我看来工厂设置不需要多美观,但是一定要方便修改,添加功能,再就是使用方便,我就想到了用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了。还有就是如何实现单选,怎么管理状态。下一次再说。
标签:
原文地址:http://www.cnblogs.com/gelandesprung/p/4231980.html