AndroidSDK中我很喜欢的一个地方就是preference框架。相对于iOS的SDK,我更喜欢Android的,因为它可以更方便的创建布局。你只需要编辑一个很简单的XML文件,就可以创建一个PreferenceScreen。
尽管Android提供了很多设置组件供你使用,但是有的时候,你需要自定义View来实现你需要的功能。在这个Hack里面,将会用几个例子来讲解如何自定义设置界面的框架。完成的效果如下图所示:
让我们先来看一下它的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:key="pref_first_preferencescreen_key"
android:title="Preferences">
<PreferenceCategory
android:title="User">
<EditTextPreference
android:key="pref_username"
android:summary="Username:"
android:title="Username"/>
</PreferenceCategory>
<PreferenceCategory
android:title="Application">
<Preference
android:key="pref_rate"
android:summary="Rate the app in the store!"
android:title="Rate the app"/>
<Preference
android:key="pref_share"
android:summary="Share the app with your friends"
android:title="Share it"/>
<!-- 我们可以extend已有的widget来自定义Preference-->
<com.manning.androidhacks.hack004.preference.EmailDialog
android:dialogIcon="@drawable/ic_launcher"
android:dialogTitle="Send Feedback"
android:dialogMessage="Do you want to send an email with feedback?"
android:key="pref_sendemail_key"
android:negativeButtonText="Cancel"
android:positiveButtonText="OK"
android:summary="Send your feedback by e-mail"
android:title="Send Feedback"/>
<com.manning.androidhacks.hack004.preference.AboutDialog
android:dialogIcon="@drawable/ic_launcher"
android:dialogTitle="About"
android:key="pref_about_key"
android:negativeButtonText="@null"
android:title="About"/>
</PreferenceCategory>
</PreferenceScreen>
上面的这个XML文件就会全权负责UI的生成,下面我们该加一些界面之后的逻辑了。我们先创建一个Activity,但是不是继承android.app.activity,而是继承android.preference.PreferenceActivity。代码如下:
public class MainActivity extends PreferenceActivity implements
OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//我们调用了addPreferencesFromResource()函数而不是setContentView()函数
addPreferencesFromResource(R.xml.prefs);
Preference sharePref = findPreference("pref_share");
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Check this app!");
shareIntent.putExtra(Intent.EXTRA_TEXT,
"Check this awesome app at: ...");
sharePref.setIntent(shareIntent);
//在onCreate方法中,我们可以设定perferences的intent
//这个例子里面评分的preference将会使用Intent.ACTION_VIEW
Preference ratePref = findPreference("pref_rate");
Uri uri = Uri.parse("market://details?id=" + getPackageName());
Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
ratePref.setIntent(goToMarket);
//初始化Preference的Summary
updateUserText();
}
@Override
protected void onResume() {
super.onResume();
//注册监听preference的内容改变(onResume)
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
//取消注册监听preference的内容改变(onPause)
getPreferenceScreen().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
}
@Override
public void onSharedPreferenceChanged(
SharedPreferences sharedPreferences, String key) {
//当用户名的preference改变的时候,我们需要将界面更新
if (key.equals("pref_username")) {
updateUserText();
}
}
private void updateUserText() {
EditTextPreference pref;
pref = (EditTextPreference) findPreference("pref_username");
//为了更新summary,我们需要获取这个preference,并且使用EditTextPreference的getText()方法
String user = pref.getText();
if (user == null) {
user = "?";
}
pref.setSummary(String.format("Username: %s", user));
}
}
下面的代码展示了如何创建自定义的preference。它跟我们自定义View的原理差不多。来看看代码:
//自定义的类应该继承已经存在的Preference组件
//这个例子里面我们使用DialogPreference
public class EmailDialog extends DialogPreference {
Context mContext;
public EmailDialog(Context context) {
this(context, null);
}
public EmailDialog(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
//构造函数跟我们自定义View使用的构造函数是一样的
public EmailDialog(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = context;
}
//我们重写了onClick这个函数,当点击了OK按钮的时候,我们将会使用帮助类来启动email的intent
@Override
public void onClick(DialogInterface dialog, int which) {
super.onClick(dialog, which);
if (DialogInterface.BUTTON_POSITIVE == which) {
LaunchEmailUtil.launchEmailToIntent(mContext);
}
}
}
4.1 总结
虽然设置界面框架允许你添加一些自定义的行为,但是你需要记住的是,使用自定义的目的是创建一些更易用更简单的PreferenceScreen。如果你考虑添加更多的复杂的交互设计,我还是建议你使用Dialog为主题单独创建一个Activity,然后从Preference里面启动这个DialogActivity。
4.2 相关链接
http://developer.android.com/reference/android/preference/PreferenceActivity.html
转载请注明原地址,谢谢!
http://blog.csdn.net/kost_/article/details/13510369
代码下载地址:
http://download.csdn.net/detail/u011418185/6471581