android - 对简历上的首选项进行更改时应用程序崩溃
问题描述
我的首选项页面使我的应用程序崩溃时遇到问题。在第一次访问时,它按预期运行。但是,一旦我重新访问该页面并尝试更改开关,应用程序就会崩溃。以下是我喜欢的 XML 的样子:
xmlns:app="http://schemas.android.com/apk/res-auto">
<PreferenceCategory
android:gravity="left"
android:title="@string/description_title"
app:iconSpaceReserved="false">
<SwitchPreference
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:key="@string/pallet_pref_key"
android:title="@string/pallet_pref"
app:iconSpaceReserved="false" />
<SwitchPreference
android:key="@string/nose_pref_key"
android:title="@string/nose_pref"
app:iconSpaceReserved="false" />
<SwitchPreference
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:key="@string/finish_pref_key"
android:title="@string/finish_pref"
app:iconSpaceReserved="false" />
</PreferenceCategory>
</PreferenceScreen>
Java看起来像这样:
import android.os.Bundle;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.preference.PreferenceFragmentCompat;
import androidx.preference.PreferenceManager;
import androidx.preference.SwitchPreference;
public class SettingsActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.settings_activity);
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.settings, new SettingsFragment())
.commit();
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
}
public static class SettingsFragment extends PreferenceFragmentCompat {
private SharedPreferences sharedPref;
private boolean pNose;
private boolean pPallet;
private boolean pFinish;
@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
setPreferencesFromResource(R.xml.root_preferences, rootKey);
sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());
sharedPref.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String s) {
if(s.equals(getResources().getString(R.string.pallet_pref_key))) {
pPallet = sharedPreferences.getBoolean(s,false);
SwitchPreference pNose = findPreference(getResources().getString(R.string.nose_pref_key));
SwitchPreference pFinish = findPreference(getResources().getString(R.string.finish_pref_key));
if (pPallet) {
pNose.setChecked(false);
pFinish.setChecked(false);
}
}
else if(s.equals(getResources().getString(R.string.nose_pref_key))) {
pNose = sharedPreferences.getBoolean(s,false);
SwitchPreference pPallet = findPreference(getResources().getString(R.string.pallet_pref_key));
SwitchPreference pFinish = findPreference(getResources().getString(R.string.finish_pref_key));
if (pNose) {
pPallet.setChecked(false);
pFinish.setChecked(false);
}
}
else if(s.equals(getResources().getString(R.string.finish_pref_key))) {
pFinish = sharedPreferences.getBoolean(s,false);
SwitchPreference pPallet = findPreference(getResources().getString(R.string.pallet_pref_key));
SwitchPreference pNose = findPreference(getResources().getString(R.string.nose_pref_key));
if (pFinish) {
pNose.setChecked(false);
pPallet.setChecked(false);
}
}
}
});
}
}
}
所以基本上我只是想让它一次只能启用一个开关。我做了一些研究,发现这里有几个线程提到我应该添加这个代码:
@Override
protected void onResume() {
super.onResume();
// Set up a listener whenever a key changes
getPreferenceScreen().getSharedPreferences()
.registerOnSharedPreferenceChangeListener(this);
}
@Override
protected void onPause() {
super.onPause();
// Unregister the listener whenever a key changes
getPreferenceScreen().getSharedPreferences()
.unregisterOnSharedPreferenceChangeListener(this);
}
我在想这可能是崩溃的原因,但是当我在“OnSharedPreferenceChangeListener() {”下面添加代码时,onResume() 和 onPause() 是灰色的,除非我将它提升到顶部,在这种情况下 this 关键字引发错误。有谁看到我做错了什么?
解决方案
推荐阅读
- python - 查找按日期和产品分组的最近 n 天的平均值
- php - 如何访问存储方法中保存的变量?
- python - docker容器内的Python,优雅地停止
- c++ - ubuntu 18.10 上的 std::filesystem 链接错误
- wordpress - 按 IP 限制 woocommerce 订单
- jquery - DIV onclick 功能不受 JQuery 控制
- angular - 如何使用角度从服务器下载文件?
- javascript - 首次在下拉菜单中选择选项时未收到警报
- symfony - 无法转发到不同bunde symfony的路由方法控制器
- mysql - 在文件中加载数据,在 csv 文件中的主键更新列的副本上