Android 具有最多可选选项数的ListPreference

Android 具有最多可选选项数的ListPreference,android,android-preferences,Android,Android Preferences,我希望在我的首选项菜单中有一个元素可以执行以下操作: public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) { //Code to calcuate how many are selected int code = numberSelected(); if (count > 2) { sharedPreferences.edit()

我希望在我的首选项菜单中有一个元素可以执行以下操作:

public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) {
    //Code to calcuate how many are selected
    int code = numberSelected();

    if (count > 2) {
        sharedPreferences.edit().putBoolean(key,false).commit();
        Toast.makeText(this,"Can't select more than two!",Toast.LENGTH_LONG).show();
    }
}
  • 显示选项列表
  • 许多是可选择的
  • 要选择的最大选项数2
我想到的可能性:

  • 执行一个单独的
    首选项屏幕
    ,并将选项显示为
    复选框
    ,但我不知道将max 2选项的逻辑放在何处
  • 扩展
    对话框首选项
    并手动执行

  • 最好的方法是什么?

    扩展
    对话框首选项
    将使您在外观和感觉上最接近;根据我的经验,
    首选项
    类是相当不灵活和不可扩展的

    关于
    首选项屏幕
    ,我记不太多了,但我想它是相似的


    在我开发的一个应用程序中,我们最终使用了单独的活动,通过
    Intent
    Preference
    项onClick启动。这使我们能够轻松开发需要比通常更复杂的验证逻辑的首选项屏幕。

    扩展
    对话框首选项
    将使您在外观和感觉方面最接近;根据我的经验,
    首选项
    类是相当不灵活和不可扩展的

    关于
    首选项屏幕
    ,我记不太多了,但我想它是相似的


    在我开发的一个应用程序中,我们最终使用了单独的活动,通过
    Intent
    Preference
    项onClick启动。这使我们能够轻松开发需要比通常更复杂的验证逻辑的首选项屏幕。

    您可以将最多两个选项的逻辑放在一个屏幕中

    因此,您只需在所有首选项更改时聆听它们,如果选择了无效的组合,则更新它们

    因此,您的代码如下所示:

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) {
        //Code to calcuate how many are selected
        int code = numberSelected();
    
        if (count > 2) {
            sharedPreferences.edit().putBoolean(key,false).commit();
            Toast.makeText(this,"Can't select more than two!",Toast.LENGTH_LONG).show();
        }
    }
    
    如果您自己创建了一个实现共享首选项ChangeListener的
    OnSharedPreferenceChangeListener
    ,那么您可以仅在需要执行以下操作时启用侦听器进行侦听:

    @Override
    protected void onResume() {
    super.onResume();
        //Register the listener
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        // Unregister the listener
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    }
    

    您可以将最多两个选项的逻辑放在一个表中

    因此,您只需在所有首选项更改时聆听它们,如果选择了无效的组合,则更新它们

    因此,您的代码如下所示:

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) {
        //Code to calcuate how many are selected
        int code = numberSelected();
    
        if (count > 2) {
            sharedPreferences.edit().putBoolean(key,false).commit();
            Toast.makeText(this,"Can't select more than two!",Toast.LENGTH_LONG).show();
        }
    }
    
    如果您自己创建了一个实现共享首选项ChangeListener的
    OnSharedPreferenceChangeListener
    ,那么您可以仅在需要执行以下操作时启用侦听器进行侦听:

    @Override
    protected void onResume() {
    super.onResume();
        //Register the listener
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        // Unregister the listener
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    }
    

    这就是我所做的:*从DialogPreference扩展。*在onCreateDialogView上,我使用不同的复选框创建布局。*“我的值”加载到由标记分隔的字符串中。*创建了一个从字符串转换为int[]的类,反之亦然。**此类使用HashSet并具有maxSize。这是一种黑客行为,但有效:)谢谢Christopher。这就是我所做的:*从DialogPreference扩展。*在onCreateDialogView上,我使用不同的复选框创建布局。*“我的值”加载到由标记分隔的字符串中。*创建了一个从字符串转换为int[]的类,反之亦然。**此类使用HashSet并具有maxSize。这是一种黑客,但它的工作:)谢谢克里斯托弗。