Hack4-自定义PreferenceActivity界面
16lz
2021-01-24
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组件//这个例子里面我们使用DialogPreferencepublic 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
更多相关文章
- C语言函数的递归(上)
- Android笔记 - Android启动之Android(安卓)Framework启动
- android 准妈妈孕周计算器 mama孕周计算
- Android(安卓)命名规范 (提高代码可以读性)
- Android:你不知道的 WebView 使用漏洞
- android 中遇到的Ui问题
- Android(安卓)Studio开发之 JNI 篇的简单示例
- Android(安卓)解决多个Fragment切换时不断实例化
- 点评Android(安卓)App埋点总结