32

私は一晩中頭を悩ませてきましたが、この小さなことを達成できないようです. アプリの PreferenceActivity に SwitchPreference を追加したいと思います。以下は写真です。

言い過ぎる前に、私の問題はまさにこれです: 設定の Switch 部分だけにリスナーを置くことができないようです。環境設定に onPreferenceTreeClick と onPreferenceClick を設定できます。テキスト部分を押すと、うまく機能します。しかし、スイッチをオフからオンに変更しても、スイッチ自体は何もしません。

SwitchPreferenceのドキュメントを読みました。Android/packages/Settings も調べたところ、AOSP は Wi-Fi と Bluetooth の SwitchPreference ではなく Switch を使用しているようです。

これが私の試みです(設定項目全体を押すと機能しますが、スイッチを押すだけでは機能しません):

サンプル:

public class Preferences extends SherlockPreferenceActivity {

public static final String PREF_THEME = "pref_theme_interface";
public static final String PREF_ROOT = "pref_root";
public static final String PREF_APP = "pref_app";

public static SharedPreferences mTheme;
private static SharedPreferences mUpdate;
public static SharedPreferences.Editor mEditor;

public boolean SDK_COMPAT = true;

boolean pSwitch = false; 
boolean update = true;

Preference autoUpdate;

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            this.finish();
            break;
    }
    return super.onOptionsItemSelected(item);
}

    @Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(MainActivity.THEME);
    super.onCreate(savedInstanceState);
    final ActionBar actionBar = getSupportActionBar();
    actionBar.setHomeButtonEnabled(true);
    actionBar.setDisplayHomeAsUpEnabled(true);
    actionBar.setIcon(R.drawable.ic_preferences);

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
        SDK_COMPAT = false;
    }

    mUpdate = PreferenceManager.getDefaultSharedPreferences(this);
    update = mUpdate.getBoolean("update", false);

    // Load the preferences from an XML resource
    addPreferencesFromResource(R.xml.preferences);

    setPreferenceScreen(createPreferenceSDK());

}

private PreferenceScreen createPreferenceSDK() {
    // Root
    PreferenceScreen root = (PreferenceScreen)findPreference(PREF_ROOT);

    PreferenceCategory prefApp = (PreferenceCategory)findPreference(PREF_APP);

    //root.addPreference(prefApp);

    if (SDK_COMPAT == true) {
        pSwitch = true;
        autoUpdate = new SwitchPreference(this);
        autoUpdate.setKey("auto_update_pref");
        autoUpdate.setTitle(R.string.auto_update);
        //autoUpdate.setSummary(update == false ? "Disabled" : "Enabled");
        prefApp.addPreference(autoUpdate);
    } else {
        pSwitch = false;
        autoUpdate = new CheckBoxPreference(this);
        autoUpdate.setKey("auto_update_pref");
        autoUpdate.setTitle(R.string.auto_update);
        autoUpdate.setSummary(R.string.auto_update_summary);
        prefApp.addPreference(autoUpdate);
    }

    autoUpdate.setOnPreferenceClickListener(new OnPreferenceClickListener() {

        public boolean onPreferenceClick(Preference preference) {
            mEditor = mUpdate.edit();
            boolean checked = ((SwitchPreference) preference)
                    .isChecked();
            if (checked) {
                update = true;
                mEditor.putBoolean("update", true);
                mEditor.commit();
                autoUpdate.setSummary(update == false ? "Disabled" : "Enabled");
            } else {
                update = false;
                mEditor.putBoolean("update", false);
                mEditor.commit();
                autoUpdate.setSummary(update == false ? "Disabled" : "Enabled");
            }
            return true;
        }

    });

    return root;
}

ですから、あなたを失った場合に備えて、私の質問を繰り返します。SwitchPreference の Switch 部分にリスナーを設定するにはどうすればよいですか? 当たり前のことでしたらよろしくお願いします。これを追加しようとしたとき、昨夜はかなり遅くなりました。

よろしくお願いします。

注: 1. CheckBoxPreference に固執することに反対しているわけではありませんが、見栄えが良いため、Switch を使用することを好みます。

  1. はい、もっと簡単/より良い方法があることを知っていますか? SDK チェックを行う代わりに res/xml と res/xml-v14 を使用して動的設定を追加する方法。私はちょうどテストのためにそれをしました。

設定画面のイメージ

編集

うまくいけば、これは他の誰かに役立ちます!Tushar の提案に感謝します :-)

autoUpdate.setOnPreferenceChangeListener(new OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference,
                Object newValue) {
            boolean switched = ((SwitchPreference) preference)
                    .isChecked();
            update = !switched;
            mEditor = mUpdate.edit();
            mEditor.putBoolean("update", update);
            mEditor.commit();
            autoUpdate.setSummary(update == false ? "Disabled" : "Enabled");

            return true;
        }

    });
4

3 に答える 3

36

Use setOnPreferenceChangeListener() instead of setOnPreferenceClickListener().

于 2012-06-13T20:25:51.600 に答える
8

作業コード

public static class SettingsFragment extends PreferenceFragment {

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.pref_notification);

            SwitchPreference vibrateSwitch = (SwitchPreference) findPreference("notification_vibrate");

            if (vibrateSwitch != null) {
                vibrateSwitch.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                    @Override
                    public boolean onPreferenceChange(Preference arg0, Object isVibrateOnObject) {
                        boolean isVibrateOn = (Boolean) isVibrateOnObject;
                        if (isVibrateOn) {
                            Vibrator v = (Vibrator) getActivity().getSystemService(Context.VIBRATOR_SERVICE);
                            v.vibrate(400);
                        }
                        return true;
                    }
                });
            }
        }

}
于 2015-12-16T12:02:01.200 に答える
0

onPreferenceChangeこれを行うための良い方法がまだわからない場合は、設定をクリックしても複数の呼び出しが作成されない方法を見つけました。私は別の質問でそれを書きました:二重機能 SwitchPreference

于 2013-07-11T08:29:38.077 に答える