天天看点

Hack4-自定义PreferenceActivity界面4.1 总结4.2 相关链接

AndroidSDK中我很喜欢的一个地方就是preference框架。相对于iOS的SDK,我更喜欢Android的,因为它可以更方便的创建布局。你只需要编辑一个很简单的XML文件,就可以创建一个PreferenceScreen。

尽管Android提供了很多设置组件供你使用,但是有的时候,你需要自定义View来实现你需要的功能。在这个Hack里面,将会用几个例子来讲解如何自定义设置界面的框架。完成的效果如下图所示:

Hack4-自定义PreferenceActivity界面4.1 总结4.2 相关链接

让我们先来看一下它的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