当前位置: 首页 > 知识库问答 >
问题:

找不到片段构造函数(设置活动)

李弘光
2023-03-14

每当我进入设置活动并旋转设备时,我都会收到此错误消息“找不到片段构造函数”。下面是我的设置活动onCreate()方法和设置片段类。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SharedPreferences sharedPreferences = 
        PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        setContentView(R.layout.settings_activity);
        if (savedInstanceState == null) {
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(R.id.settings, new SettingsFragment(this))
                    .commit();
        }
        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
        }
    }

public static class SettingsFragment extends PreferenceFragmentCompat {
        WeakReference<SettingsActivity> activityWeakReference;
        SettingsFragment(SettingsActivity activity) {
            activityWeakReference = new WeakReference<>(activity);
        }
        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey);
            ListPreference listPreference = findPreference("jojojojo");
            if (listPreference != null) {
                listPreference.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                    @Override
                    public boolean onPreferenceChange(Preference preference, Object newValue) {
                        activityWeakReference.get().setResult(1);
                        return true;
                    }
                });
            }

            SwitchPreferenceCompat switchPreferenceCompat = findPreference("lalalala");
            if (switchPreferenceCompat != null) {
                switchPreferenceCompat.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
                    @Override
                    public boolean onPreferenceChange(Preference preference, Object newValue) {
                        if ((boolean)newValue) {
                            activityWeakReference.get().mostrarMensaje(getString(R.string.toastFrasesOn));
                            activityWeakReference.get().setResult(2);
                        } else {
                            activityWeakReference.get().setResult(3);
                        }
                        return true;
                    }
                });
            }
        }
    }

共有1个答案

阴靖
2023-03-14

我想这里的问题是片段没有默认构造函数。创建参数化构造函数隐藏了默认构造函数。也不建议创建参数化构造函数。

Fragment的所有子类都必须包含一个公共的无参数构造函数。框架通常会在需要时重新实例化片段类,特别是在状态恢复期间,并且需要能够找到此构造函数来实例化它。如果无参数构造函数不可用,则在某些情况下,在状态还原期间会发生运行时异常。参数可以由调用方使用setArguments(Bundle)提供,然后由带有getArguments()的片段检索。

解决问题

>

  • Setting sFrament中删除当前参数化的构造函数

    添加一个无参数构造函数,如下所示:

    公共设置片段(){}

    将活动引用传递给片段也不是一个好主意。ViewModel的使用是在活动和片段之间进行通信的一种更新的替代方法,从而允许片段可以有一个空的构造函数。

  •  类似资料:
    • 我在一些设备上面临这个问题,并在崩溃分析中出错。很多用户设备都面临这个问题,但在我的设备上运行良好。 无法启动活动ComponentInfo{com.ox.outloks.new/com.ox.outloks.new.activities.maindraweractivity}:Android.support.v4.app.fragment$instantiationexception:无法实例化

    • 当创建一个流行的片段时,我得到一个空的构造函数错误。 请看看我写的代码,创建碎片时如何传递数据?

    • 我试图调用一个片段,但有时会收到以下错误,即使我的片段中有空构造函数 作为

    • 我在一些设备上遇到了这个问题,并且在我的崩溃分析中出现了一个错误。当应用程序遇到ANR故障并且错误为 无法启动activity ComponentInfo{com.qwykr.dryver.base/com.qwykr.dryver.base.activities.MainActivity}:Android.support.v4.app.fragment$InstantiationExceptio

    • 我有以下错误。我在DailyVerseFrament上添加了构造函数。但它仍然不起作用。我有这个问题超过一个星期了。

    • 问题内容: 我的MyBatis映射有问题。我有一个像这样的领域类: 一个映射器类,具有如下方法: 在数据库中,三列的类型分别为Number,Timestamp和Clob,并且名称与类字段中的名称相同。 当我使用此方法时,我得到一个: ExecutorException:在[MyClass;中找不到构造函数。 匹配[java.math.BigDecimal,java.sql.Timestamp,or