我正在尝试将2015年用Java编写的应用程序重写为Kotlin,但是发现了一个问题,即不赞成使用getFramgentManager
Java代码:
SettingsActivity
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();
}
}
SettingsFragment
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());
}
}
}
在科特林
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是抽象类
答案 0 :(得分:0)
val fm : FragmentManager = FragmentActivity().supportFragmentManager
在此处丢失FragmentActivity()
构造函数调用,只需访问当前活动中应扩展supportFragmentManager
或直接或间接扩展的FragmentActivity
。
您不应该自己实例化活动。
答案 1 :(得分:0)
我确定您一定会遇到以下异常或类似情况。
Caused by: java.lang.IllegalStateException: Activity has been destroyed
这意味着您不能从客户端创建活动的实例。
如果没有特殊要求,请从AppCompatActivity()
起扩展您的活动
我在您的代码中做了一些重构。以下代码应该可以工作。
class SettingsActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
actionBar?.setDisplayHomeAsUpEnabled(true)
supportFragmentManager.beginTransaction()
.replace(android.R.id.content, SettingsFragment()).commit()
}
}