有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java试图仅在变量设置为false时运行代码

因此,我使用Android的SharedReferences来保存和加载用户选择的颜色,但是没有检查首选项“initial”是否为假,导航到设置活动会导致应用程序崩溃,因为它无法加载颜色首选项,因为尚未设置。现在,我已经通过使用“初始”首选项(意思是首选颜色已经存储)阻止了崩溃,但现在颜色首选项没有被保存。我应该提到颜色是我单选按钮组的选择

以下是我的设置活动:

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();
}

}

我在Main活动中运行此方法:

public void runBefore() {
    SharedPreferences sharedPreferences = getSharedPreferences("initial", 0);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putBoolean("initial", false);
    editor.commit();
}

正如我所提到的,当你关闭或按下“设置”活动的“后退”按钮时,颜色不会被保存,如果有人知道解决方法,或者可以帮助我更改代码,这样就不会出现崩溃,这将是一个很大的帮助


共 (2) 个答案

  1. # 1 楼答案

    我不相信你真的需要“初始”偏好。你的应用程序崩溃的原因很可能是因为在以下情况下使用了空默认值:

    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);
        }
    }
    
  2. # 2 楼答案

    问题就在下面一行

    if (sharedPreferences.getBoolean("initial", false)) 
    

    这是您第一次想要执行第一个块。。但是在第一次查看时,SharedReferences将返回false,并且不会执行此操作

    你有两个选择

    1. if (!sharedPreferences.getBoolean("initial", false)) 或者
    2. 将默认值intial设置为true