0

SharedPreferencesを使用して設定を保存し、SharedPreferenceに基づいてメニュー項目のデフォルトのチェック状態を変更しようとしています。しかし、それは機能していないようです。メニューの選択は、アプリが閉じられるまで続きます。アプリをリロードすると、新しいSharedPreference設定ではなく、設定がデフォルトに戻ります。

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

3 に答える 3

1

==文字列変数を符号で比較しないでください

ここ

if (preference == "us")
        menu.findItem(R.id.menu_us).setChecked(true);
    else if (preference == "metric")
        menu.findItem(R.id.menu_metric).setChecked(true);

代わりに使用する.equals()

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);
于 2012-10-25T03:29:03.790 に答える
1

onPrepareOptionsMenuメニューがユーザーに表示される直前に呼び出されることに注意してください。呼び出しているコードを見て、setChecked(true)ローカル変数R.id.menu_usR.id.menu_metric基づいています。ローカル変数prefsの値は、アクティビティが作成されるたびに常になります。trueしたがって、これらの状態を維持するには、ローカル変数の値ではなく、設定値に基づいてメニュー項目を更新する必要があります。

onPrepareOptionsMenu以下のように関数と関数を変更onCreateOptionsMenuして、試してみてください。

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;
}
于 2012-10-25T04:09:10.260 に答える
1

私は両方の答えから少し使用しました、そして私はいくつかの欠けている部分を自分で見つけました。私が理解した主な問題の1つは、「休憩」がなかったことです。私のswitchステートメントでは、どちらを選択しても、両方のケースが実行されていました。他の最終的な修正は、呼び出す代わりにでした

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属性を変更しようとしているときに、onCreateOptionsMenuではなく「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; 

}

onPrepareOptionsMenuは、選択されている選択肢を切り替えるために、引き続き「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);
}
于 2012-10-25T16:39:02.927 に答える