Elyar的Android笔记(九):自定义首选项
在项目中会大量用到首选项,大多数情况下系统提供的元素不能满足我们的需求。根据App的具体情况,需要添加自己的布局。
好了,废话少说。
首先借鉴一下Lyndon1115前辈提供的资料对Preference家庭元素有点认识:
Preference布局结构和View的布局结构本质上还是大同小异,Preference的优点在于布局界面的可控性和高效率以及可存储值的简洁性(每个PreferenPreferencece存储在相对应下的SharedPreference文件夹下)。 下面,我们对比Preference和View下得各个子控件,对他们的家庭元素在宏观上有个更好的把握性。
单一控件:
Preference 控件家庭 View控件家庭 控件含义
Preference TextView 文本框
CheckPreference CheckBox 单选框
EditTextPreference EditText 输入文本框
ListPreference ListView 列表框
RingtonePreference —— 铃声
组合控件:
PreferenceCategory :类似于LinearLayou、RelativeLayout,用于组合一组Preference,使布局更具备层次感 。
PreferenceScreen : 所有Preference元素的根节点。
===================================================================================================================================
来个Demo进一步学习:
(一):在工程MyPreferenceDemo / res 中 创建xml 文件夹,并在其中创建mypreference.xml,注意:创建时 Resource Type 为:Preference 类型而不是 Layout类型
(1)mypreference.xml的内容:
<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:key="aaaaa" >
<PreferenceCategory android:key="add_head" />
<PreferenceCategory
android:key="set_local"
android:title="我的位置" >
<CheckBoxPreference
android:defaultValue="true"
android:key="apply_wifi"
android:summary="使用无线网络在应用程序(例如Google地图)中查看位置"
android:title="使用无线网络" >
</CheckBoxPreference>
<CheckBoxPreference
android:key="apply_gps"
android:summary="定位到街道级别(需要消耗更多的电量以及天气允许)"
android:title="使用GPS" >
</CheckBoxPreference>
</PreferenceCategory>
<PreferenceCategory android:title="无线和网络设置" >
<CheckBoxPreference
android:key="apply_fly"
android:summary="禁用所有无线连接"
android:title="飞行模式" >
</CheckBoxPreference>
<CheckBoxPreference
android:key="apply_internet"
android:summary="禁用通过USB共享Internet连接"
android:title="Internet共享" >
</CheckBoxPreference>
<CheckBoxPreference
android:key="apply_wifi"
android:summary="打开Wi-Fi"
android:title="Wi-Fi" >
</CheckBoxPreference>
<Preference
android:dependency="apply_wifi"
android:key="wifi_setting"
android:summary="设置和管理无线接入点"
android:title="Wi-Fi设置" >
</Preference>
<CheckBoxPreference
android:key="apply_bluetooth"
android:summary="启用蓝牙"
android:title="蓝牙" >
</CheckBoxPreference>
<Preference
android:dependency="apply_bluetooth"
android:key="bluetooth_setting"
android:summary="管理连接、设备设备名称和可检测性"
android:title="蓝牙设置" >
</Preference>
<EditTextPreference
android:key="number_edit"
android:title="输入电话号码" >
</EditTextPreference>
<ListPreference
android:dialogTitle="选择部门"
android:entries="@array/department"
android:entryValues="@array/department_value"
android:key="depart_value"
android:title="部门设置" >
</ListPreference>
<RingtonePreference
android:key="ring_key"
android:ringtoneType="all"
android:showDefault="true"
android:showSilent="true"
android:title="铃声" >
</RingtonePreference>
</PreferenceCategory>
</PreferenceScreen>
(2)在mypreference.xml 中用到的资源文件MyPreferenceDemo / res / values / array:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="department">
<item>综合部</item>
<item>外贸部</item>
<item>行政部</item>
</string-array>
<string-array name="department_value">
<item>001</item>
<item>002</item>
<item>003</item>
</string-array>
</resources>
(二):定义菜单样式:在java代码中创建
package com.example.mp;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.view.Menu;
import android.view.MenuItem;
public class MainActivity extends Activity {
public static final int SET = Menu.FIRST;
public static final int EXIT = Menu.FIRST + 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
// 创建Menu菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, SET, 0, "设置");
menu.add(0, EXIT, 0, "退出");
return super.onCreateOptionsMenu(menu);
}
// 点击Menu菜单选项响应事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case 1:
Intent mIntent = new Intent();
mIntent.setClass(this, Myprefrence.class);
startActivity(mIntent);
break;
case 2:
finish();
break;
}
return super.onOptionsItemSelected(item);
}
}
效果:
(三)在java代码中关联myprefrence
package com.example.mp;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceClickListener;
import android.preference.PreferenceActivity;
import android.preference.PreferenceCategory;
import android.preference.PreferenceGroup;
import android.preference.PreferenceScreen;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Myprefrence extends PreferenceActivity implements OnClickListener {
private PreferenceCategory screen;
private Preference parent;
private MyHeader header;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
<span style="color:#FF0000;">addPreferencesFromResource(R.xml.myprefrence);<span style="color:#000000;">//通过此方法关联</span>
</span>
//以下内容暂时不用
//screen = (PreferenceCategory) findPreference("add_head");
//header = new MyHeader(Myprefrence.this);
//header.setHeaderListenner(this);
//screen.addPreference(header);
}
}
效果:
今天的内容:
(四)在设置页面顶部添加我们自己的布局(自定义):
MyPreferenceDemo / res / layout / myheader.xml
<?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="wrap_content"
android:orientation="vertical" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Return"
android:textSize="18sp" />
</LinearLayout>
自定义内容可以根据实际情况进行布局,为了体现出效果我就加了一个Button(相当难看,凑合着看看吧);
关键:
自定义一个Preference(这就是我们今天讲的自定义部分)
package com.example.mp;
import android.content.Context;
import android.preference.Preference;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MyHeader extends Preference {
public OnClickListener headerListener;
public MyHeader(Context context) {
super(context);
setLayoutResource(R.layout.myheader);<span style="color:#FF0000;">//关联自定义的布局</span>
// TODO Auto-generated constructor stub
}
@Override
protected void onBindView(View view) {
// TODO Auto-generated method stub
super.onBindView(view);
Button button = (Button) view.findViewById(R.id.btn);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (headerListener != null) {
headerListener.onClick(v);
}
}
});
}
public void setHeaderListenner(OnClickListener onClickListener) {
this.headerListener = onClickListener;
}
}
(五)引用自定义内容
在第三步中暂时不需要的内容现在起到关键作用了(将自定义的内容添加到设置页面);
......
//以下内容暂时不用
//screen = (PreferenceCategory) findPreference("add_head");
//header = new MyHeader(Myprefrence.this);
//header.setHeaderListenner(this);
//screen.addPreference(header);
.......
效果:
好了完成了,不要评论效果,我不是UI设计师,
我的搭档Diylar会给我解决效果问题。
总结一下:也就呢么几步,为了简单易懂,功能写的超级简单了。就是四到五完成工作。
第四步:自定义
第五步:添加。
小生就写到这,如有不符之处,请大牛们指导。
转载请注明出处:http://blog.csdn.net/u012418084