Android 找不到CheckBoxPreference依赖项错误

Android 找不到CheckBoxPreference依赖项错误,android,dependencies,Android,Dependencies,我有这张支票 CheckBoxPreference sendToEmailPref = new CheckBoxPreference(this); sendToEmailPref.setTitle("Send To Email"); sendToEmailPref.setDependency("emailList"); 我想将其依赖项设置为键“emailList” emailList是一个自定义的构建首选项,它将电子邮件收件人存储为字符串 然而,我得到了这个错误 Caused by: java

我有这张支票

CheckBoxPreference sendToEmailPref = new CheckBoxPreference(this);
sendToEmailPref.setTitle("Send To Email");
sendToEmailPref.setDependency("emailList");
我想将其依赖项设置为键“emailList” emailList是一个自定义的构建首选项,它将电子邮件收件人存储为字符串

然而,我得到了这个错误

Caused by: java.lang.IllegalStateException: Dependency not found.....
在onCreate中将.setDependency()设置为紧跟在setPreferenceScreen()之后。它应该会起作用

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setPreferenceScreen(createPreferenceHierarchy());
    getPreferenceScreen().findPreference("_key_of_depend_to_").setDependency("emailList");
}

我在SharedPreferenceChangeListener上使用了一个
来执行此操作。

您应该在调用完addPreference后调用setDependency
这对我很管用

在将依赖项添加到
复选框首选项之前,请确保已使用“emailList”键添加了首选项。我的
首选项片段
)中有如下内容


您可以尝试以下代码:-

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();
}
private静态最终字符串PARENT\u CHECKBOX\u PREFERENCE=“PARENT\u CHECKBOX\u PREFERENCE”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
PreferenceScreen root=getPreferenceManager().createPreferenceScreen(此);
设置首选项屏幕(根);
PopulateReferenceHierarchy(根);
}
私有void PopulateReferenceHierarchy(首选项屏幕pScreenRoot){
//偏好属性
PreferenceCategory prefAttrsCat=新的PreferenceCategory(此);
prefAttrsCat.setTitle(“首选项属性”);
pScreenRoot.addPreference(prefAttrsCat);
//视觉父切换首选项
CheckBoxPreference parentCheckBoxPref=新的CheckBoxPreference(此);
parentCheckBoxPref.setKey(父项复选框首选项);
parentCheckBoxPref.setTitle(“标题\父项\首选项”);
parentCheckBoxPref.setSummary(“总结父项偏好”);
prefAttrsCat.addPreference(parentCheckBoxPref);
//视觉子切换首选项
//请参阅res/values/attrs.xml以了解定义TogglePrefAttrs的方法。
TypedArray typeA=获得的StyledAttributes(R.styleable.TogglePrefAttrs);
CheckBoxPreference childCheckBoxPref=新的CheckBoxPreference(此);
childCheckBoxPref.setKey(“ChildCheckBoxPreference”);
childCheckBoxPref.setTitle(“标题和儿童偏好”);
childCheckBoxPref.setSummary(“summary_child_preference”);
childCheckBoxPref.setLayoutResource(typeA.getResourceId(R.styleable.TogglePrefAttrs_android_preferenceLayoutChild,0));
prefAttrsCat.addPreference(childCheckBoxPref);
childCheckBoxPref.setDependency(父项复选框首选项);
typeA.recycle();
}

您应该在
设置首选项屏幕(您的屏幕)
假设我写:

 override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
        val context = preferenceManager.context
        val screen = preferenceManager.createPreferenceScreen(context)
        ...
并有一个选择:

val mySwitchPreference = SwitchPreference(context)
mySwitchPreference.key = "my_switch_preference"
screen.addPreference(mySwitchPreference )
...
还有一个seekbarp引用,我想依赖于“mySwitchPreference”。 如果开关为“ON”,则启用seekbar,否则禁用seekbar:

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



preferenceScreen = screen
mySeekBarPreference.dependency = mySwitchPreference.key
如果您确实尝试设置seekBarPrefernece的依赖项,请在设置之前 屏幕作为首选项屏幕,它会显示以下错误:

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

这基本上是对ys126答案的澄清。
val mySeekBarPreference = SeekBarPreference(context)
mySeekBarPreference.key = "my_seekbar_preference"
screen.addPreference(mySeekBarPreference)
...



preferenceScreen = screen
mySeekBarPreference.dependency = mySwitchPreference.key
java.lang.IllegalStateException: Dependency "my_switch_preference" not found for preference "my_seekbar_preference"