在 PreferenceFragment 中解组时找不到类

Posted

技术标签:

【中文标题】在 PreferenceFragment 中解组时找不到类【英文标题】:Class not found when unmarshalling in PreferenceFragment 【发布时间】:2020-10-03 22:09:45 【问题描述】:

我尝试实现可直接从设置中更改的日/夜系统。我为此使用了 PreferenceFragmentCompat,但是,当我按下切换首选项以更改模式时。我有以下错误:

E/Parcel: Class not found when unmarshalling: androidx.fragment.app.FragmentManagerState
    java.lang.ClassNotFoundException: androidx.fragment.app.FragmentManagerState
Caused by: java.lang.ClassNotFoundException: androidx.fragment.app.FragmentManagerState
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

我到处找,但我真的不明白错误来自哪里..


这是我的偏好活动:

public class PreferencesActivity extends AppCompatActivity implements SharedPreferences.OnSharedPreferenceChangeListener 

    @Override
    protected void onCreate(Bundle savedInstanceState) 

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_preferences);

        PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);

        if (savedInstanceState == null)
            getSupportFragmentManager().beginTransaction().replace(R.id.preferences_container, new PreferencesFragment()).commit();
    


    @Override
    protected void onDestroy() 
        super.onDestroy();
        PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(this);
    

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) 
        if(key.contains(getString(R.string.KEY_PREF_NIGHT_MODE)))
            AppCompatDelegate.setDefaultNightMode(sharedPreferences.getBoolean(key, false)? AppCompatDelegate.MODE_NIGHT_YES: AppCompatDelegate.MODE_NIGHT_NO);
    


    public static class PreferencesFragment extends PreferenceFragmentCompat 
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) 
            setPreferencesFromResource(R.xml.preferences, rootKey);
        

    


我使用这个布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_
    android:layout_
    android:background="@color/noteRecyclerBackground"
    tools:context=".PreferencesActivity">

    <FrameLayout
        android:id="@+id/preferences_container"
        android:layout_
        android:layout_>
    </FrameLayout>

</LinearLayout>

【问题讨论】:

它在哪一行崩溃了,你检查你的导入了吗?确保您没有将 androidx 类与框架或支持 lib 类混合。 没有崩溃,但出现错误,这是使用AppCompatDelegate.setDefaultNightMode(sharedPreferences.getBoolean(key, false)? AppCompatDelegate.MODE_NIGHT_YES: AppCompatDelegate.MODE_NIGHT_NO);重新启动活动时 【参考方案1】:

没有崩溃,但出现错误,这是使用 AppCompatDelegate.setDefaultNightMode(sharedPreferences.getBoolean(key, false)? AppCompatDelegate.MODE_NIGHT_YES: AppCompatDelegate.MODE_NIGHT_NO); 重新启动活动时;

嗯,per the documentation,这听起来像是预期的行为。

如果在“创建”任何附加了 AppCompatDelegates 的主机组件之后调用此方法,则每个主机组件都会发生 uiMode 配置更改。 这可能会导致重新创建这些组件,具体取决于它们的清单配置

【讨论】:

我不知道,但如果错误没有导致您出现问题并且预计会重新启动,为什么不忽略它并继续前进?

以上是关于在 PreferenceFragment 中解组时找不到类的主要内容,如果未能解决你的问题,请参考以下文章

ClassNotFoundException 解组时真的不知道为啥

部分 JSON 在 Go 中解组为地图

如何在单个路由中解组 POST 参数和 JSON 正文?

如何在 jax-ws 网络服务中解组 xml 文件

Jaxb:在同一个包中解组具有多个命名空间的 xml

如何使用 spring 集成 dsl 从 JMS 队列中解组 XML