java - Android 应用程序在尝试打开 SettingsFragment 后崩溃

标签 java android kotlin fragment

我正在尝试将 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/

相关文章:

java - 试图了解 "both methods have same erasure, yet neither overrides the other"的情况

java - 根据视频长度倒计时器

java - 如何从 FileProvider URI 获取真实路径?

java - 针对多个 XSD(存储为资源)验证 XML。 Spring 启动

java - 您如何确定CLASS是否是Spring代理?

java - 检查HBase表中是否存在某个值

java - 使用枚举键和不同值类型进行映射

java - Android:为什么我的 ArrayAdapter 没有填充?

android - 旋转90度且较小的画廊照片的问题

java - 为什么 Hibernate 没有将 session 设置为可自动关闭?