簡體   English   中英

啟用后,新的PreferenceScreen無法打開

[英]New PreferenceScreen doesn't open after enabling

我一直在為我的項目使用AndroidX首選項庫。 該項目具有主菜單和子菜單。 我已經設置了主菜單中的CheckBoxPreference和子菜單中的PreferenceScreen之間的依賴關系。 選中CheckBox后,PreferenceScreen被啟用,但是我無法打開子菜單。

如果刪除依賴項,一切正常!

<?xml version="1.0" encoding="utf-8"?>
<androidx.preference.PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBoxPreference
        android:key="checkbox1"
        android:summaryOff="Description of checkbox 1 off"
        android:summaryOn="Description of checkbox 1 on"
        android:title="CheckBox 1">
    </CheckBoxPreference>
    <ListPreference
        android:dependency="checkbox1"
        android:entries="@array/entries"
        android:entryValues="@array/entry_values"
        android:key="list"
        android:summary="Description of list"
        android:title="List">
    </ListPreference>
    <CheckBoxPreference
        android:key="checkbox2"
        android:summary="Description of checkbox 2"
        android:title="CheckBox 2">
    </CheckBoxPreference>
    <PreferenceScreen
        android:key="screen"
        android:dependency="checkbox2"
        android:summary="Description of screen"
        android:title="Screen">
        <CheckBoxPreference
            android:key="checkbox3"
            android:summary="Description of checkbox 3"
            android:title="CheckBox 3">
        </CheckBoxPreference>
        <PreferenceCategory
            android:key="category1"
            android:summary="Description of category 1"
            android:title="Category 1">
            <CheckBoxPreference
                android:key="checkbox4"
                android:summary="Description of checkbox 4"
                android:title="CheckBox 4">
            </CheckBoxPreference>
        </PreferenceCategory>
        <PreferenceCategory
            android:key="category2"
            android:dependency="checkbox3"
            android:summary="Description of category 2"
            android:title="Category 2">
            <CheckBoxPreference
                android:key="chb5"
                android:summary="Description of checkbox 5"
                android:title="CheckBox 5">
            </CheckBoxPreference>
            <CheckBoxPreference
                android:key="chb6"
                android:summary="Description of checkbox 6"
                android:title="CheckBox 6">
            </CheckBoxPreference>
        </PreferenceCategory>
    </PreferenceScreen>
</androidx.preference.PreferenceScreen>

PreferencesFragment.java

public class PreferencesFragment extends PreferenceFragmentCompat {

    CheckBoxPreference checkBoxPreference;
    PreferenceCategory preferenceCategory;


    public static final String FRAGMENT_TAG = "my_preference_fragment";

    public PreferencesFragment(){

    }

    @Override
    public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
        setPreferencesFromResource(R.xml.preferences, rootKey);

        checkBoxPreference = findPreference("checkbox3");
        preferenceCategory = findPreference("category2");
        preferenceCategory.setEnabled(checkBoxPreference.isChecked());

        checkBoxPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                preferenceCategory.setEnabled(checkBoxPreference.isChecked());
                return false;
            }
        });
    }
}

PreferencesActivity.java

public class PreferencesActivity extends AppCompatActivity
        implements PreferenceFragmentCompat.OnPreferenceStartScreenCallback{

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState == null) {
            Fragment fragment = getSupportFragmentManager()
                    .findFragmentByTag(PreferencesFragment.FRAGMENT_TAG);
            if (fragment == null) {
                fragment = new PreferencesFragment();
            }
        }

        getSupportFragmentManager()
                .beginTransaction()
                .replace(android.R.id.content, new PreferencesFragment())
                .commit();

    }

    @Override
    public boolean onPreferenceStartScreen(PreferenceFragmentCompat caller,
                                           PreferenceScreen preferenceScreen) {
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        PreferencesFragment preferencesFragment = new PreferencesFragment();
        Bundle args = new Bundle();
        args.putString(PreferenceFragmentCompat.ARG_PREFERENCE_ROOT, preferenceScreen.getKey());
        preferencesFragment.setArguments(args);
        fragmentTransaction.replace(android.R.id.content, preferencesFragment,
                preferenceScreen.getKey());
        fragmentTransaction.addToBackStack(preferenceScreen.getKey());
        fragmentTransaction.commit();
        return true;
    }

}

我期望開始一個新的首選項,但實際上我已經做到了:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: edu.allexfiloenko.lesson62_preferences_enable, PID: 9233
    java.lang.IllegalStateException: Dependency "checkbox2" not found for preference "screen" (title: "Screen"
        at androidx.preference.Preference.registerDependency(Preference.java:1393)
        at androidx.preference.Preference.onAttached(Preference.java:1357)
        at androidx.preference.PreferenceGroup.onAttached(PreferenceGroup.java:444)
        at androidx.preference.PreferenceFragmentCompat.bindPreferences(PreferenceFragmentCompat.java:484)
        at androidx.preference.PreferenceFragmentCompat.onViewCreated(PreferenceFragmentCompat.java:272)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:892)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManagerImpl.java:1238)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManagerImpl.java:1303)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:439)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManagerImpl.java:2076)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManagerImpl.java:1866)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManagerImpl.java:1821)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManagerImpl.java:1727)
        at androidx.fragment.app.FragmentManagerImpl$2.run(FragmentManagerImpl.java:150)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

這實際上不是受支持的用例,因此一般不建議嵌套PreferenceScreen。

相反,我建議使用一個單獨的片段,並使用一個單獨的層次結構。 您可以在第一個屏幕中使用“首選項”鏈接到第二個屏幕。 然后,該首選項將具有依賴性,並且應該可以正常工作。

出於興趣考慮,我認為這里的實際問題是,移至新屏幕后,外部層次結構不再存在,但是作為新根目錄的PreferenceScreen仍然具有此依賴性,因此它將查找首選項“ checkbox2”不復存在 :)

有關更多信息,請參見設置指南

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM