【问题标题】:How to do opposite of of preference attribute android:dependency?如何与偏好属性 android:dependency 相反?
【发布时间】:2011-04-05 05:58:23
【问题描述】:

是否有与android:dependency 完全相反的 XML 属性?

我希望在未选中另一个时启用依赖首选项并在选中时禁用它。

编辑:也许问题不在于android:dependency,也许我可以添加一个 xml 属性来禁用该首选项的默认值,然后android:dependency 将按照我想要的相反方式切换它。

再次编辑: 我尝试在首选项中设置android:enabled="false",它像我想要的那样禁用它,但即使它依赖于其他首选项,它也没有像我希望的那样启用它

【问题讨论】:

    标签: java android xml dependencies preferences


    【解决方案1】:

    实际上是我自己找到的,我想我只是把它贴在这里来帮助任何可能遇到同样问题的人:

    android:disableDependentsState="true"
    

    把它放在控制偏好中。

    【讨论】:

    • confirmed.. 将该行添加到您放入 android:dependency 的 Preference 中:)
    • 更清楚一点:将该行放在您的偏好依赖的偏好上。文档说:“导致 dependents 被禁用的状态(开启为 true,关闭为 false)”。
    • 但是如果我想启用一些首选项并禁用一些首选项取决于一个复选框首选项?
    • 完美!对于更明显的“将其放入控制首选项”意味着,在 SwitchPreference(Master)中添加 android:disableDependentsState="true" 代码,这会影响其他人(Slaves)
    【解决方案2】:

    这是我从代码而不是 XML 执行此操作的代码示例。

      String eitherKey = "either";
      String orKey = "or";
      CheckBoxPreference either = new CheckBoxPreference(this);
      either.setKey(eitherKey);
      either.setTitle("Either");
      either.setSummary("It is either one or");
      either.setDefaultValue(false);
      either.setDisableDependentsState(true);
      inlinePrefCat.addPreference(either);
    
      try
      {
         //Crossfade Time
         CheckBoxPreference or = new CheckBoxPreference(this);
         or.setKey(orKey);
         or.setTitle("Or");
         or.setSummary("the other");
         inlinePrefCat.addPreference(or);
         or.setDependency(eitherKey);
      }
      catch (Exception e)
      {
      }
    

    【讨论】:

      【解决方案3】:

      Dmytro Zarezenko 询问如果您希望某些依赖项在其所依赖的首选项为 true 时启用,而在该首选项为 false 时启用一些依赖项。

      使用上述方法设置一种类型的所有依赖首选项(具有更大的数量)。然后(具有实现 OnSharedPreferenceChangeListener 的类)在 Preference Activity 和/或 Preference Fragment 中有这样的代码:

      @Override
      public void onResume()
      {
          super.onResume();
          sharedPreferences.registerOnSharedPreferenceChangeListener(this);
      }
      @Override
      public void onPause()
      {
          super.onPause();
          sharedPreferences.unregisterOnSharedPreferenceChangeListener(this);
      }
      public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
      {
          if (key.equals("pref_that_they_depend-upon")
          {
              // Iterate over the preferences that need to be enabled or disabled,
              // lets say there is just one called the_awkward_one.
              Preference preference = findPreference("the_awkward_one");
              // Or preference.setEnabled(! sharedPreferences.getBoolean(("pref_that_they_depend-upon", defaultValue));
              preference.setEnabled(sharedPreferences.getBoolean(("pref_that_they_depend-upon", defaultValue));
          }
      }
      

      【讨论】:

        【解决方案4】:

        我需要更改依赖偏好的值,所以如果有人想这样做,我会在下面发布我的代码:

        @Override
        public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
            if(preference.getKey().equals("key_a")) {
                ((CheckBoxPreference)findPreference("key_b").setChecked(false);
            }
            return super.onPreferenceTreeClick(preferenceScreen, preference);
        }
        

        【讨论】:

        • 恕我直言,Steve Waring 的解决方案更可取,因为它不管是什么导致偏好值发生变化。也就是说,如果你在代码中设置了“key_a”,Waring的方案会生效,而这里的方案不会生效(因为没有“点击”)。
        【解决方案5】:

        让你的PreferenceActivity implement

        SharedPreferences.OnSharedPreferenceChangeListener

        PreferenceActivity中声明:

        SharedPreferences prefs;

        onCreate初始化:

        SharedPreferences sPrefs = PreferenceManager.getDefaultSharedPreferences(this); prefs = sPrefs;

        并在共享偏好更改侦听器上注册

        prefs.registerOnSharedPreferenceChangeListener(this);
        

        按照史蒂夫在onResumeonPause 方法中所说的那样做。

        onSharedPreferenceChanged监听器的实现:

        @Override
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            Log.d("SettingsActivity","onSharedPreferenceChanged LISTENER FIRED");
            if (key.equals(getString(R.string.key_call))) {
                //if call true
                if (sharedPreferences.getBoolean(getString(R.string.key_call), false)) {
                    Preference preference = findPreference(getString(R.string.key_record));
                    preference.setEnabled(false);
                } else { // if call false
                    Preference preference = findPreference(getString(R.string.key_record));
                    preference.setEnabled(true);
                }
            }
            if (key.equals(getString(R.string.key_record))) {
                //if record true
                if (sharedPreferences.getBoolean(getString(R.string.key_record), false)) {
                    Preference preference = findPreference(getString(R.string.key_call));
                    preference.setEnabled(false);
                } else { // if record false
                    Preference preference = findPreference(getString(R.string.key_call));
                    preference.setEnabled(true);
                }
            }
        }
        

        在这种情况下,我在 PreferenceActivity 中有 2 个互斥的首选项。 通话和录音。 当两者都未选中时,都可以选中,但当用户选中其中一个时,另一个会被禁用(灰显)。 当用户取消选中选中的首选项时,用户可以选中另一个。

        其他首选项可以依赖于它们,这可以通过 XML 文件中的android:dependancy 属性来解决。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-13
          • 1970-01-01
          相关资源
          最近更新 更多