尝试打开SettingsFragment后,Android应用程序崩溃

时间:2019-12-11 22:00:24

标签: java android kotlin fragment

我正在尝试将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是抽象类

2 个答案:

答案 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()

}
}