【问题标题】:CheckBoxPreference dependency not found error未找到 CheckBoxPreference 依赖项错误
【发布时间】:2012-03-10 13:41:28
【问题描述】:

我有这个 CheckBoxPreference

CheckBoxPreference sendToEmailPref = new CheckBoxPreference(this);
sendToEmailPref.setTitle("Send To Email");
sendToEmailPref.setDependency("emailList");

我想设置它对“emailList”键的依赖 emailList 是一个自定义构建首选项,它将电子邮件收件人存储为字符串。

但是,我收到了这个错误

Caused by: java.lang.IllegalStateException: Dependency not found.....

【问题讨论】:

    标签: android dependencies


    【解决方案1】:

    让你的 .setDependency() 在你的 onCreate 中的 setPreferenceScreen() 之后。它应该工作。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        setPreferenceScreen(createPreferenceHierarchy());
        getPreferenceScreen().findPreference("_key_of_depend_to_").setDependency("emailList");
    }
    

    【讨论】:

      【解决方案2】:
      final CheckBoxPreference sendImageToEmail = (CheckBoxPreference) findPreference("send_image_to_email");
      listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
      @Override
      public void onSharedPreferenceChanged(
          SharedPreferences sharedPreferences, String key) {
              if (key.equals("emailList")) {
                  String emails = sharedPreferences
                          .getString("emailList", "");
                  if (emails.equals("")) {
                      sendImageToEmail.setChecked(false);
      

      我使用了OnSharedPreferenceChangeListener 来做到这一点。

      【讨论】:

        【解决方案3】:

        你应该在调用完 addPreference 之后调用 setDependency 它对我很有效!

        【讨论】:

          【解决方案4】:

          确保您在将依赖项添加到CheckBoxPreference 之前添加了带有“emailList”键的首选项。我有类似下面的东西为我工作(在我的PreferenceFragment)。

          Context context = getActivity();
          
          PreferenceScreen root = getPreferenceManager.createPreferenceScreen(context);
          setPreferenceScreen(root);
          
          CustomPreference customPref = new CustomPreference(context);
          customPref.setTitle("My Custom Preference");
          customPref.setKey("emailList");
          
          root.addPreference(customPref);
          
          CheckBoxPreference sendToEmailPref = new CheckBoxPreference(context);
          sendToEmailPref.setTitle("Send To Email");
          
          root.addPreference(sendToEmailPref);
          
          sendToEmailPref.setDependency("emailList");
          

          【讨论】:

          • 这基本上是对ys126的答案的澄清。
          【解决方案5】:

          你可以试试下面的代码:-

          private static final String PARENT_CHECKBOX_PREFERENCE = "parent_checkbox_preference";
          
              @Override
              protected void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  PreferenceScreen root = getPreferenceManager().createPreferenceScreen(this);
                  setPreferenceScreen(root);
                  populatePreferenceHierarchy(root);
              }
          
          private void populatePreferenceHierarchy(PreferenceScreen pScreenRoot) {
                  // Preference attributes
                  PreferenceCategory prefAttrsCat = new PreferenceCategory(this);
                  prefAttrsCat.setTitle("preference_attributes");
                  pScreenRoot.addPreference(prefAttrsCat);
          
                  // Visual parent toggle preference
                  CheckBoxPreference parentCheckBoxPref = new CheckBoxPreference(this);
                  parentCheckBoxPref.setKey(PARENT_CHECKBOX_PREFERENCE);
                  parentCheckBoxPref.setTitle("title_parent_preference");
                  parentCheckBoxPref.setSummary("summary_parent_preference");
                  prefAttrsCat.addPreference(parentCheckBoxPref);
          
          
                  // Visual child toggle preference
                  // See res/values/attrs.xml for the <declare-styleable> that defines TogglePrefAttrs.
                  TypedArray typeA = obtainStyledAttributes(R.styleable.TogglePrefAttrs);
                  CheckBoxPreference childCheckBoxPref = new CheckBoxPreference(this);
                  childCheckBoxPref.setKey("child_checkbox_preference");
                  childCheckBoxPref.setTitle("title_child_preference");
                  childCheckBoxPref.setSummary("summary_child_preference");
                  childCheckBoxPref.setLayoutResource(typeA.getResourceId(R.styleable.TogglePrefAttrs_android_preferenceLayoutChild, 0));
                  prefAttrsCat.addPreference(childCheckBoxPref);
                  childCheckBoxPref.setDependency(PARENT_CHECKBOX_PREFERENCE);
          
                  typeA.recycle();
          }
          

          【讨论】:

            【解决方案6】:

            你应该在setPreferenceScreen(yourScreen)之后写sendToEmailPref.setDependency("emailList") 假设我写:

             override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
                    val context = preferenceManager.context
                    val screen = preferenceManager.createPreferenceScreen(context)
                    ...
            

            并且有一个 switchPreference :

            val mySwitchPreference = SwitchPreference(context)
            mySwitchPreference.key = "my_switch_preference"
            screen.addPreference(mySwitchPreference )
            ...
            

            并且有一个我想依赖于“mySwitchPreference”的 SeekBarPreference。 如果开关为“ON”,则启用搜索栏,否则禁用搜索栏:

            val mySeekBarPreference = SeekBarPreference(context)
            mySeekBarPreference.key = "my_seekbar_preference"
            screen.addPreference(mySeekBarPreference)
            ...
            
            
            
            preferenceScreen = screen
            mySeekBarPreference.dependency = mySwitchPreference.key
            

            如果您确实尝试为 seekBarPrefernece 设置依赖项,则在设置之前 屏幕作为 PreferenceScreen,它会给你这个错误:

            java.lang.IllegalStateException: Dependency "my_switch_preference" not found for preference "my_seekbar_preference"
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-03-20
              • 2021-03-17
              • 2019-02-24
              • 2021-06-16
              • 2017-09-18
              • 2013-08-26
              相关资源
              最近更新 更多