【问题标题】:Could not find fragment constructor (settings activity)找不到片段构造函数(设置活动)
【发布时间】:2021-11-23 10:31:36
【问题描述】:

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

@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;
                    }
                });
            }
        }
    }

【问题讨论】:

  • 您可以添加您的SettingsFragment 吗?谢谢
  • @akhilnair 完成。

标签: java android fragment settings


【解决方案1】:

我猜这里的问题是 Fragment 没有默认构造函数。创建参数化构造函数会隐藏默认构造函数。也不建议创建参数化构造函数。

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

解决问题

  1. 删除SettingsFragment中的当前参数化构造函数

  2. 如下添加无参数构造函数:

    public SettingsFragment(){}

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

【讨论】:

  • 那么,如何修复 SettingsFragment 类?可以举个例子吗?
  • @Mike087 你的问题现在解决了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多