ページ

2012/07/15

[Android]twiccaプラグインを作ってみた 設定アクション編

せっかくなので設定も追加してみた。
関連:[Android]twiccaプラグインを作ってみた ツイート表示アクション編 | DevAchieve

設定用に PreferenceActivity を追加する。
PreferenceActivity は Android 3.0 以上からは Prefarence Fragment に置き換えられるらしい。
そして Android 3.0 未満は Compatibility Package というのを使って対応するらしい。
Support Library | Android Developersにある。
でもtwiccaプラグインの一つの項目しか無い設定画面1ページにそこまでするのが面倒大げさな気がする。
いや、はい。Xperia Arc(Android 2.3以上にアップデート出来ない宿命を背負った端末)から変えたら対応するよ…。

ということで Androidmanifest.xml に Intent を受け取れるように記述する。
設定アクション | Developers | twicca - Yet another Twitter client for Android.
<activity
    android:name=".QuoteTweetSettings"
    android:label="@string/app_name"
    >
    <intent-filter>
        <action android:name="jp.r246.twicca.ACTION_PLUGIN_SETTINGS" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
QuoteTweetSettings.java で設定画面用XMLを onCreate() で読み込んで onStart() で色々する。
@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    addPreferencesFromResource(R.xml.pref);
}

@Override
protected void onStart(){
    super.onStart();

    final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);
    CheckBoxPreference check = (CheckBoxPreference)getPreferenceScreen().findPreference(getString(R.string.key));
    check.setChecked(sp.getBoolean(check.getKey(), false));
    check.setOnPreferenceChangeListener(new OnPreferenceChangeListener(){
        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue){
            if(preference.getClass() == CheckBoxPreference.class){
                if(preference.getKey().equals(getString(R.string.key))){
                    sp.edit().putBoolean(preference.getKey(), (Boolean)newValue).commit();
                    return true;
                }
            }
            return false;
        }
    });
}
sp を final にしておくと OnPreferenceChangeListener() 内で使えるから便利。
設定項目が多かったら無名インナークラスで書くのはやめたほうがよさそう。
クラスの比較はなんかできたのでやってみただけ。意味は無い。と思う。
複数の CheckBoxPreference の onPreferenceChange() を一回の記述で済ませられそう。
そのためにはキーを string.xml で string-array で保存すればいけるのかもしれない。

addPreferencesFromResource(R.xml.pref);で読み込んだやつ。
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference
 android:key="@string/key"
 android:title="@string/title"
 android:summaryOn="@string/on"
 android:summaryOff="@string/off"
 android:defaultValue="false"
 />
</PreferenceScreen>
ハードコーディングすると変更時に死ねるので全部 string.xml にぶち込む。
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">QuoteTweet プラグイン for twicca</string>
    <string name="key">reply</string>
    <string name="title">リプライを入れる</string>
    <string name="on">QT @screen_name https://twitter.com/</string>
    <string name="off">QT https://twitter.com/</string>
</resources>