我得到这个错误信息"无法找到片段构造器";每当我进入设置活动并旋转设备时。以下是我的设置活动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;
}
});
}
}
}
我猜这里的问题是Fragment没有默认构造函数。创建参数化构造函数隐藏默认构造函数。也不建议创建参数化构造函数。
Fragment的所有子类必须包含一个公共的无参数构造函数。框架经常会在需要时重新实例化一个片段类,特别是在状态恢复期间,并且需要能够找到这个构造函数来实例化它。如果无参数构造函数不可用,在某些情况下,在状态恢复期间将发生运行时异常。参数可以由调用者用setargarguments (Bundle)提供,然后由Fragment用getargarguments()获取。
修复问题
-
删除
SettingsFragment
中当前参数化的构造函数 -
按如下方式添加一个无参数构造函数:
public SettingsFragment(){}
将活动引用传递给片段也不是一个好主意。在Activity和Fragment之间进行通信的一个更新的选择,从而允许Fragment可以有一个空的构造函数,这将是使用ViewModels。