PreferenceActivityを使ってそこそこ簡単に設定画面を作れるのは良いのですが、特別な機能を持った項目を追加したい場合があります。
今回は、設定画面からWebのページへジャンプする項目を作る要件があったので、Preferenceを拡張して実装しました。
単純にPreferenceをres/xml/pref.xmlに書いて、PreferenceActivityの中でクリックイベントを設定することもできますが、なるべくコードをすっきりさせたいですし、再利用性も考えてLinkPreferenceというクラスを作成します。リンク先をXMLのアトリビュートに書くだけでジャンプ先を指定できます。
まずはpref.xmlにLinkPreferenceを追加します。
res/xml/pref.xml
<?xml version="1.0" encoding="utf-8"?> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:hoge="http://schemas.android.com/apk/res/hoge" > <info.loadlimits.android.preference.LinkPreference android:key="link_preference" android:title="サイトをブラウザで表示" hoge:url="http://blog.loadlimits.info/" /> </PreferenceScreen>
名前空間は適当に定義しておきます。どうせここ以外では使われません。3行目にxmlns:hogeを指定します。8行目で指定されたURLがジャンプ先になります。
res/values/attr.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="url" format="string" /> <declare-styleable name="LinkPreference"> <attr name="android:key" /> <attr name="android:title" /> <attr name="android:summary" /> <attr name="url" /> </declare-styleable> </resources>
attr.xmlで新しく追加するプロパティを定義します。declare-styleableを指定することで、R.styleable.LinkPreferenceやR.styleable.LinkPreference_urlが自動的に定義されます。
あとは実際のLinkPreferenceの中身を書けば完了です。
src/info/loadlimits/android/preference/LinkPreference.java
package info.loadlimits.android.preference; import android.content.Context; import android.content.Intent; import android.content.res.TypedArray; import android.net.Uri; import android.preference.Preference; import android.util.AttributeSet; public class LinkPreference extends Preference { private String mUrl; public LinkPreference(Context context) { this(context, null); } public LinkPreference(Context context, AttributeSet attrs) { super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.LinkPreference); mUrl = a.getString(R.styleable.LinkPreference_url); a.recycle(); } @Override protected void onClick() { Uri uri = Uri.parse(mUrl); Intent intent = new Intent(Intent.ACTION_VIEW, uri); getContext().startActivity(intent); } }
こういうカスタムPreferenceや、他のカスタムViewも含めてどこかでまとめて公開して再利用がしやすいようにしたいですね。