我正在尝试将 2015 年用 Java 编写的应用程序重写为 Kotlin,但发现了一个问题,即 getFramgentManager 已被弃用
Java 代码:
设置 Activity
import ...
public class SettingsActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Objects.requireNonNull(getActionBar()).setDisplayHomeAsUpEnabled(true);
// Display the fragment as the main content.
getFragmentManager().beginTransaction()
.replace(android.R.id.content, new SettingsFragment())
.commit();
}
}
设置 fragment
public class SettingsFragment extends PreferenceFragment implements SharedPreferences.OnSharedPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
Preference pref = findPreference(key);
if (pref instanceof ListPreference) {
ListPreference listPref = (ListPreference) pref;
pref.setSummary(listPref.getEntry());
}
}
}
Kotlin
class SettingsActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (actionBar != null) {
actionBar!!.setDisplayHomeAsUpEnabled(true)
}
// Display the fragment as the main content.
val fm : FragmentManager = FragmentActivity().supportFragmentManager
fm.beginTransaction()
.replace(android.R.id.content, SettingsFragment())
.commit()
}
}
class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener {
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
addPreferencesFromResource(R.xml.preferences)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences)
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) {
val pref = findPreference<Preference>(key)
if (pref is ListPreference) {
pref.setSummary(pref.entry)
}
}
}
它在字符串 .commit
上崩溃。我该怎么做才能修复它?我尝试了 StackOverflow 的很多指令,但没有任何效果
我不能只做 FragmentManager().beginTransaction()
.replace(android.R.id.content,SettingsFragment())
.commit()
,因为 FragmentManager 是抽象类
最佳答案
我确信您一定遇到以下异常或类似异常。
Caused by: java.lang.IllegalStateException: Activity has been destroyed
这意味着您不能从客户端创建 Activity 实例。
如果没有特殊要求,请从 AppCompatActivity()
开始延长您的 Activity 时间
我对你的代码做了一些重构。下面的代码应该可以工作。
class SettingsActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
actionBar?.setDisplayHomeAsUpEnabled(true)
supportFragmentManager.beginTransaction()
.replace(android.R.id.content, SettingsFragment()).commit()
}
}
关于java - Android 应用程序在尝试打开 SettingsFragment 后崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59294755/