【问题标题】:SwitchPreference onChecked/onClick ListenerSwitchPreference onChecked/onClick 监听器
【发布时间】:2015-12-16 20:02:01
【问题描述】:

我整晚都在绞尽脑汁,但似乎无法完成这件小事。我想将 SwitchPreference 添加到我的应用程序的 PreferenceActivity 中。下面是一张图片。

在我说太多之前,我的问题就是这样:我似乎不能只在偏好的 Switch 部分设置监听器。我可以在首选项上设置一个 onPreferenceTreeClick 和一个 onPreferenceClick ,如果我按下文本部分,效果很好。但是当我将它从关闭更改为开启时,开关本身什么也不做。

我已阅读 SwitchPreference 上的文档。我还查看了 android/packages/Settings,看起来 AOSP 使用的是 Switch,而不是 Wi-Fi 和蓝牙的 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. 是的,我知道有更简单/更好的方法吗?使用 res/xml 和 res/xml-v14 添加动态首选项的方法,而不是进行 SDK 检查。我这样做只是为了测试。

picture of preference screen

编辑

希望这对其他人有帮助!感谢 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;
        }

    });

【问题讨论】:

  • 你试过用 setOnPreferenceChangeListener 代替吗?
  • Tushar,其实我没试过。让我试一试。谢谢。
  • 告诉我进展如何。我很好奇。
  • 感谢您的建议。这就是我所做的,它似乎工作正常。虽然 isChecked() 很有趣。它返回的结果与我的预期相反......我用方法编辑了原始问题
  • 是的,在我看来,切换按钮在 UI 中是非常不受欢迎的,因为它们很难通过快速浏览来判断(例如:“on”文本是否意味着它已打开,或者它是否意味着我可以打开它在?)。我会将我的解决方案作为答案提交,以便其他人可以更轻松地找到它。

标签: java android


【解决方案1】:

使用setOnPreferenceChangeListener() 代替setOnPreferenceClickListener()

【讨论】:

    【解决方案2】:

    工作代码

    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;
                        }
                    });
                }
            }
    
    }
    

    【讨论】:

      【解决方案3】:

      如果您还没有找到一个好的方法来做到这一点,我已经想出了一些不会创建多次调用 onPreferenceChange 的方法,而单击首选项会这样做。我在另一个问题中写了它:dual functionality SwitchPreference

      【讨论】:

        猜你喜欢
        • 2016-08-16
        • 1970-01-01
        • 2019-05-27
        • 2019-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-30
        • 2011-03-31
        相关资源
        最近更新 更多