Android SharedReference不重新创建菜单

Android SharedReference不重新创建菜单,android,sharedpreferences,Android,Sharedpreferences,我试图使用SharedReferences来存储首选项,然后根据SharedReference更改菜单项的默认选中状态。但它似乎不起作用。菜单选项将一直保留,直到应用程序关闭。当我重新加载应用程序时,该设置将恢复为默认设置,而不是新的SharedReference设置 public class MainActivity extends Activity { boolean prefs = true; String FILENAME = "settings"; String string; p

我试图使用SharedReferences来存储首选项,然后根据SharedReference更改菜单项的默认选中状态。但它似乎不起作用。菜单选项将一直保留,直到应用程序关闭。当我重新加载应用程序时,该设置将恢复为默认设置,而不是新的SharedReference设置

public class MainActivity extends Activity {

boolean prefs = true;
String FILENAME = "settings";
String string;

public static final String LOG_TAG = "dbryant423";
public static final String PREFS_NAME = "settings";

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.v(LOG_TAG, "prefs value: " +prefs);

 }

public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.menu, menu);
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    String preference = settings.getString("preference", string);
    if (preference == "us")
        menu.findItem(R.id.menu_us).setChecked(true);
    else if (preference == "metric")
        menu.findItem(R.id.menu_metric).setChecked(true);
    return true; 
}

// called when an item is selected
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) { // decide which MenuItem was pressed based on it's id
    case R.id.menu_us:
            menuUS();

    case R.id.menu_metric:
            menuMetric();

    }
    return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    if (prefs == true)
        menu.findItem(R.id.menu_us).setChecked(true);
    else if (prefs == false)
        menu.findItem(R.id.menu_metric).setChecked(true);
    return true;
}

public void menuUS() {
    prefs = true;
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString("preference", "us");
    editor.commit();
}

public void menuMetric() {
    prefs = false;
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString("preference", "metric");
    editor.commit();
}

public void calculateCylinder(View v) {
    Intent calculateCylinderUS = new Intent(this, CalculateCylinder.class);
    Intent calculateCylinderMetric = new Intent(this, CalculateCylinderMetric.class);
     Log.v(LOG_TAG, "prefs value: " +prefs);
    if (prefs == true)
        startActivity(calculateCylinderUS);
    else if (prefs == false)
        startActivity(calculateCylinderMetric);
}

不要通过
==
符号比较字符串变量

这里

使用
.equals()


不要通过
==
符号比较字符串变量

这里

使用
.equals()


请注意,在向用户显示菜单之前会调用
onPrepareOptions功能表
。 查看您在
R.id.menu\u us
上调用的代码
setChecked(true)
以及基于局部变量
prefs
R.id.menu\u metric
,每当创建活动时,其值将始终
true
。所以为了保持这些状态,我们必须根据偏好值而不是局部变量的值来更新菜单项

我想您最好修改您的
on prepareOptions功能表
on createOptions功能表
功能,如下所示,并尝试一下:

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    return true; 
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    String preference = settings.getString("preference", string);
    if (preference == "us")
        menu.findItem(R.id.menu_us).setChecked(true);
    else if (preference == "metric")
        menu.findItem(R.id.menu_metric).setChecked(true);
    return true;
}

请注意,在向用户显示菜单之前会调用
onPrepareOptions功能表
。 查看您在
R.id.menu\u us
上调用的代码
setChecked(true)
以及基于局部变量
prefs
R.id.menu\u metric
,每当创建活动时,其值将始终
true
。所以为了保持这些状态,我们必须根据偏好值而不是局部变量的值来更新菜单项

我想您最好修改您的
on prepareOptions功能表
on createOptions功能表
功能,如下所示,并尝试一下:

public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu, menu);
    return true; 
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    String preference = settings.getString("preference", string);
    if (preference == "us")
        menu.findItem(R.id.menu_us).setChecked(true);
    else if (preference == "metric")
        menu.findItem(R.id.menu_metric).setChecked(true);
    return true;
}

我用了两个答案中的一点,我自己发现了一些缺失的部分。我发现的一个主要问题是,我的switch语句中没有“break;”,无论我选择哪一个,它都在运行这两种情况。另一个最终解决方案是不打电话

public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.menu, menu);
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    String preference = settings.getString("preference", string);
    if (preference.equals("us"))
        menu.findItem(R.id.menu_us).setChecked(true);
    else if (preference.equals("metric"))
        menu.findItem(R.id.menu_metric).setChecked(true);
    return true; 

}
在我的if/else if语句试图修改setChecked属性时,我意识到我所需要做的只是修改onCreateOptions菜单中的“prefs”值。像这样:

public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.menu, menu);
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    String preference = settings.getString("preference", string);
    if (preference.equals("us"))
        prefs = true;
    else if (preference.equals("metric"))
        prefs = false;
    return true; 

}
OnPrepareOptions功能表仍然需要“setChecked”来切换已选择的选项。 以下是更新后的工作代码:

public class MainActivity extends Activity {

boolean prefs = true;
String FILENAME = "settings";
String string;

public static final String LOG_TAG = "dbryant423";
public static final String PREFS_NAME = "settings";

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.v(LOG_TAG, "prefs value onCreate: " +prefs);

 }

public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.menu, menu);
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    String preference = settings.getString("preference", string);
    if (preference.equals("us"))
        prefs = true;
    else if (preference.equals("metric"))
        prefs=false;
    return true; 

}

// called when an item is selected
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) { // decide which MenuItem was pressed based on it's id
    case R.id.menu_us:
            menuUS();
            break;
    case R.id.menu_metric:
            menuMetric();
            break;          
    }
    return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    SharedPreferences settings = getSharedPreferences(PREFS_NAME,0);
    String preference = settings.getString("preference", string);
    if (preference.equals("us"))
        menu.findItem(R.id.menu_us).setChecked(true);
    else if (preference.equals("metric"))
        menu.findItem(R.id.menu_metric).setChecked(true);
    return true;
}

public void menuUS() {
    prefs = true;
    SharedPreferences settings = getSharedPreferences(PREFS_NAME,   Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString("preference", "us");
    editor.commit();
    Log.v(LOG_TAG, "prefs value menuUS: " +prefs);
}

public void menuMetric() {
    prefs = false;
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString("preference", "metric");
    editor.commit();
    Log.v(LOG_TAG, "prefs value menuMetric: " +prefs);
}

public void calculateCylinder(View v) {
    Intent calculateCylinderUS = new Intent(this, CalculateCylinder.class);
    Intent calculateCylinderMetric = new Intent(this, CalculateCylinderMetric.class);
     Log.v(LOG_TAG, "prefs value calculateCylinder: " +prefs);
    if (prefs == true)
        startActivity(calculateCylinderUS);
    else if (prefs == false)
        startActivity(calculateCylinderMetric);
}

我用了两个答案中的一点,我自己发现了一些缺失的部分。我发现的一个主要问题是,我的switch语句中没有“break;”,无论我选择哪一个,它都在运行这两种情况。另一个最终解决方案是不打电话

public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.menu, menu);
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    String preference = settings.getString("preference", string);
    if (preference.equals("us"))
        menu.findItem(R.id.menu_us).setChecked(true);
    else if (preference.equals("metric"))
        menu.findItem(R.id.menu_metric).setChecked(true);
    return true; 

}
在我的if/else if语句试图修改setChecked属性时,我意识到我所需要做的只是修改onCreateOptions菜单中的“prefs”值。像这样:

public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.menu, menu);
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    String preference = settings.getString("preference", string);
    if (preference.equals("us"))
        prefs = true;
    else if (preference.equals("metric"))
        prefs = false;
    return true; 

}
OnPrepareOptions功能表仍然需要“setChecked”来切换已选择的选项。 以下是更新后的工作代码:

public class MainActivity extends Activity {

boolean prefs = true;
String FILENAME = "settings";
String string;

public static final String LOG_TAG = "dbryant423";
public static final String PREFS_NAME = "settings";

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.v(LOG_TAG, "prefs value onCreate: " +prefs);

 }

public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.menu, menu);
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
    String preference = settings.getString("preference", string);
    if (preference.equals("us"))
        prefs = true;
    else if (preference.equals("metric"))
        prefs=false;
    return true; 

}

// called when an item is selected
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) { // decide which MenuItem was pressed based on it's id
    case R.id.menu_us:
            menuUS();
            break;
    case R.id.menu_metric:
            menuMetric();
            break;          
    }
    return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    SharedPreferences settings = getSharedPreferences(PREFS_NAME,0);
    String preference = settings.getString("preference", string);
    if (preference.equals("us"))
        menu.findItem(R.id.menu_us).setChecked(true);
    else if (preference.equals("metric"))
        menu.findItem(R.id.menu_metric).setChecked(true);
    return true;
}

public void menuUS() {
    prefs = true;
    SharedPreferences settings = getSharedPreferences(PREFS_NAME,   Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString("preference", "us");
    editor.commit();
    Log.v(LOG_TAG, "prefs value menuUS: " +prefs);
}

public void menuMetric() {
    prefs = false;
    SharedPreferences settings = getSharedPreferences(PREFS_NAME, Activity.MODE_PRIVATE);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString("preference", "metric");
    editor.commit();
    Log.v(LOG_TAG, "prefs value menuMetric: " +prefs);
}

public void calculateCylinder(View v) {
    Intent calculateCylinderUS = new Intent(this, CalculateCylinder.class);
    Intent calculateCylinderMetric = new Intent(this, CalculateCylinderMetric.class);
     Log.v(LOG_TAG, "prefs value calculateCylinder: " +prefs);
    if (prefs == true)
        startActivity(calculateCylinderUS);
    else if (prefs == false)
        startActivity(calculateCylinderMetric);
}

感谢Ram kiran对标签的编辑。:)感谢Ram kiran对标签的编辑。:)好的,当我修改代码以反映这一点时,它仍然以默认的“us”开头,但现在,无论我选择哪一个,它都会切换到“metric”,我无法将其更改回去。另外,“prefs”不是一个局部变量,它早就在
公共类MainActivity extends Activity{boolean prefs=true;String FILENAME=“settings”下面声明了;String String;
这就是使更改持续到关闭并重新启动的原因。答案对问题的一部分有帮助。好的,当我更改代码以反映这一点时,它仍然以默认的“us”开头,但现在,无论我选择哪一个,它都会切换到“metric”,我无法将其更改回来。另外,“prefs”不是局部变量,它早就在
公共类MainActivity extends Activity{boolean prefs=true;String FILENAME=“settings”下声明了;String String;
这就是使更改持续到关闭并重新启动的原因。答案对部分问题有帮助。答案对部分问题有帮助。答案对部分问题有帮助。