所以我使用Android的SharedPreferences来保存和加载用户选择的颜色,但是如果没有检查首选项“initial”是否为false,导航到SettingsActivity会导致应用程序崩溃,因为它无法加载由于没有设定,因此颜色偏好。现在,我已经通过使用“初始”首选项(意味着已经存储了首选项颜色)来阻止此崩溃,但现在没有保存颜色的首选项。我应该提一下颜色是我的单选按钮组。
这是我的设置活动:
public class SettingsActivity extends Activity {
RadioGroup colourPicker;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// requesting to turn the title OFF
requestWindowFeature(Window.FEATURE_NO_TITLE);
// making it full screen
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
// set layout file for this activity
setContentView(R.layout.settings);
// lock orientation to portrait
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
// radio group id
colourPicker = (RadioGroup) findViewById(R.id.colourPicker);
// listeners
colourPicker.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
switch (checkedId) {
case R.id.radioOrange:
save("orange");
Log.d("colour", "saving orange");
break;
case R.id.radioLilac:
save("lilac");
Log.d("colour", "saving lilac");
break;
case R.id.radioRed:
save("red");
Log.d("colour", "saving red");
break;
case R.id.radioTeal:
save("teal");
Log.d("colour", "saving teal");
break;
}
}
});
}
@Override
public void onResume() {
super.onResume();
SharedPreferences sharedPreferences = getSharedPreferences("initial", 0);
if (sharedPreferences.getBoolean("initial", false)) {
colourPicker.check(R.id.radioOrange);
sharedPreferences = getSharedPreferences("colour", 0);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("initial", true);
editor.commit();
} else {
load();
}
}
// save colour choice
private void save(final String colour) {
SharedPreferences sharedPreferences = getSharedPreferences("colour", 0);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("colour", colour);
editor.commit();
}
// load colour choice
private void load() {
SharedPreferences sharedPreferences = getSharedPreferences("colour", 0);
if (sharedPreferences.getString("colour", null).equals("orange")) {
colourPicker.check(R.id.radioOrange);
} else if (sharedPreferences.getString("colour", null).equals("lilac")) {
colourPicker.check(R.id.radioLilac);
} else if (sharedPreferences.getString("colour", null).equals("red")) {
colourPicker.check(R.id.radioRed);
} else {
colourPicker.check(R.id.radioTeal);
}
}
@Override
public void onBackPressed() {
Intent mainScreenActivityIntent = new Intent(SettingsActivity.this, MainScreenActivity.class);
startActivity(mainScreenActivityIntent);
finish();
}
}
我在MainActivity中运行此方法:
public void runBefore() {
SharedPreferences sharedPreferences = getSharedPreferences("initial", 0);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putBoolean("initial", false);
editor.commit();
}
正如我所提到的,当你关闭或按下设置活动后,如果有人知道解决方法或者可以帮助我更改代码以便在没有崩溃的情况下工作,那么颜色不会被保存,这将是一个很大的帮助!
答案 0 :(得分:1)
我不相信你真的需要“初始”偏好。您的应用程序过去崩溃的原因很可能是因为在<:p>中使用了null默认值
if (sharedPreferences.getString("colour", null).equals("orange"))
如果没有首选项,则在空字符串上调用equals()方法,该字符串是空指针异常。相反,首先检查它是否== null。如果是这样,请设置默认值,否则可以使用equals()进行检查。
private void load() {
SharedPreferences sharedPreferences = getSharedPreferences("colour", 0);
String colour = sharedPreferences.getString("colour", null);
if (colour == null)
colourPicker.check(R.id.radioOrange); //Default if no preference exists
else if (colour.equals("orange")) {
colourPicker.check(R.id.radioOrange);
} else if (colour.equals("lilac")) {
colourPicker.check(R.id.radioLilac);
} else if (colour.equals("red")) {
colourPicker.check(R.id.radioRed);
} else {
colourPicker.check(R.id.radioTeal);
}
}
答案 1 :(得分:0)
问题出在以下一行
if (sharedPreferences.getBoolean("initial", false))
第一次你想要执行第一个块..但是第一次查看sharedpreferences将返回false,这将不会被执行。
你有两个选择
if (!sharedPreferences.getBoolean("initial", false))
或intial
设为true
。