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


更多相关文章

  1. C语言函数的递归(上)
  2. Android笔记 - Android启动之Android(安卓)Framework启动
  3. android 准妈妈孕周计算器 mama孕周计算
  4. Android(安卓)命名规范 (提高代码可以读性)
  5. Android:你不知道的 WebView 使用漏洞
  6. android 中遇到的Ui问题
  7. Android(安卓)Studio开发之 JNI 篇的简单示例
  8. Android(安卓)解决多个Fragment切换时不断实例化
  9. 点评Android(安卓)App埋点总结

随机推荐

  1. Android中自定义底部弹出框ButtomDialog
  2. Android(安卓)网络应用--Apache HttpClie
  3. [转]android学习总结----Activity view
  4. eclipse虚拟机adb启动失败
  5. Android(安卓)Studio编写Xposed模块
  6. NDK的Windwos环境搭建
  7. android SDK中java环境变量配置
  8. Andfix使用说明
  9. framework 开发 之 mmssms.db 中表结构的
  10. Android多国语言的value文件夹命名方式