AndroidX 在 MultiSelectListPreference 上崩溃

标签 android android-layout android-fragments android-preferences androidx

我无法让 Jetpack/AndroidX 首选项与 MultiSelectListPreference 一起使用。我已将我的代码简化为此处的最简单的示例项目:https://github.com/quittle/a11y-ally/tree/simple-multi-list .

出于某种原因,在使用 AndroidX 类时,具有单个首选项 fragment 和单个空 MultiSelectListPreference 的最基本 Activity 会崩溃,但不会与 Android SDK 级别 28 中弃用的普通 Android API 一起崩溃。

我找到了 https://code.videolan.org/videolan/vlc-android/commit/1464d1a6ab882eec78ab3a749e8f06e52bbd7404 ,这似乎表明这可能是 AppCompat 库的问题,但在适应使用 AndroidX 库时并没有修复我的设置。

使用首选项的代码的最少代码 fragment

作品

public class VanillaMainActivity extends Activity {
    public static class CustomPreferenceFragment extends PreferenceFragment {
        @Override
        public void onCreate(final Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            addPreferencesFromResource(R.xml.preferences);
        }
    }

    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main_activity);

        getFragmentManager()
            .beginTransaction()
            .replace(R.id.preferences_holder, new CustomPreferenceFragment())
            .commit();
    }
}

崩溃

public class AndroidXMainActivity extends FragmentActivity {
    public static class CustomPreferenceFragment extends PreferenceFragmentCompat {
        @Override
        public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) {
            addPreferencesFromResource(R.xml.preferences);
        }
    }

    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main_activity);

        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.preferences_holder, new CustomPreferenceFragment())
                .commit();
    }
}

我在使用 AndroidX 库时得到的堆栈跟踪如下。

2018-11-05 20:32:22.318 18080-18080/com.example E/com.example: Invalid ID 0x00000000.
2018-11-05 20:32:22.320 18080-18080/com.example E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example, PID: 18080
    android.content.res.Resources$NotFoundException: Resource ID #0x0
        at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:216)
        at android.content.res.Resources.loadXmlResourceParser(Resources.java:2155)
        at android.content.res.Resources.getLayout(Resources.java:1155)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:421)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
        at androidx.appcompat.app.AlertController$AlertParams.createListView(AlertController.java:989)
        at androidx.appcompat.app.AlertController$AlertParams.apply(AlertController.java:965)
        at androidx.appcompat.app.AlertDialog$Builder.create(AlertDialog.java:982)
        at androidx.preference.PreferenceDialogFragmentCompat.onCreateDialog(PreferenceDialogFragmentCompat.java:158)
        at androidx.fragment.app.DialogFragment.onGetLayoutInflater(DialogFragment.java:330)
        at androidx.fragment.app.Fragment.performGetLayoutInflater(Fragment.java:1308)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
        at androidx.fragment.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
        at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
        at androidx.fragment.app.BackStackRecord.executeOps(BackStackRecord.java:802)
        at androidx.fragment.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
        at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
        at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
        at androidx.fragment.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
        at androidx.fragment.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

最佳答案

提交错误报告后,我被告知失败的原因是我在 Activity 中没有像 Theme.AppCompat 这样的 App Compat 主题,因此缺少资源异常。将其添加到 Activity 后,它会按预期工作。

关于AndroidX 在 MultiSelectListPreference 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53161937/

相关文章:

android - 如何在 flutter 中实现音频流应用和安全存储

android - 管理 Android 布局,一定有更好的方法

android - 比例过渡动画

java - fragment 不可滚动

java - ListFragment 适配器的通用 View 持有者类型

Android - 无法隐藏进度条

android - 开关问题 - 只有一个选项可见

android - 致命异常 : java. lang.ClassCastException : android. support.v7.widget.TintContextWrapper 无法转换为 android.app.Activity

java - 用一个拇指自定义 rangeseekbar android

java - fragment 或 Activity 中的抽屉导航?