以编程方式更改onOptionsItemSelected

时间:2016-03-12 13:40:11

标签: java android

我正在尝试以编程方式设置在 onOptionsItemSelected(MenuItem item)函数内检查的单选按钮, 但它不工作,应用程序崩溃!

MenuItem thisItem;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

int opState = 4;        //--- Just a test: can be 1-4, ie check Button 4.

thisItem = menu.findItem(R.id.menu1);  //--- Uncheck all buttons ---
thisItem.setChecked(false);
thisItem = menu.findItem(R.id.menu2);
thisItem.setChecked(false);
thisItem = menu.findItem(R.id.menu3);
thisItem.setChecked(false);
thisItem = menu.findItem(R.id.menu4);
thisItem.setChecked(false);

我假设上面将所有按钮设置为未选中状态。我在真实设备上测试它,因此无法运行任何诊断。下面检查opState的值并设置相应的菜单开关:

switch (opState) {
    case 1:
        thisItem = menu.findItem(R.id.menu1);
            thisItem.setChecked(true);
            break;
    case 2:
            thisItem = menu.findItem(R.id.menu2);
            thisItem.setChecked(true);
            break;
    case 3:
            thisItem = menu.findItem(R.id.menu3);
            thisItem.setChecked(true);
            break;
    case 4:
            thisItem = menu.findItem(R.id.menu4);
            thisItem.setChecked(true);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.activity_main_actions, menu);
    this.menu = menu;
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    switch (item.getItemId()) {
        case R.id.menu1:
            item.setTitle("1");
            if (item.isChecked()) item.setChecked(false);
            else item.setChecked(true);
            return true;
        case R.id.menu2:
            item.setTitle("2");
            if (item.isChecked()) item.setChecked(false);
            else item.setChecked(true);
            return true;
        case R.id.menu3:
            item.setTitle("3");
            if (item.isChecked()) item.setChecked(false);
            else item.setChecked(true);
            return true;
        case R.id.menu4:
            item.setTitle("4");
            if (item.isChecked()) item.setChecked(false);
            else item.setChecked(true);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

以下是上述菜单文件:

 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">
        <item
            android:id="@+id/menu1"
            android:checked="true"
            android:orderInCategory="1"
            android:showAsAction="never"
            android:title="@string/menu1"/>
        <item
            android:id="@+id/menu2"
            android:orderInCategory="2"
            android:showAsAction="never"
            android:title="@string/menu2"/>
        <item
            android:id="@+id/menu3"
            android:orderInCategory="3"
            android:showAsAction="never"
            android:title="@string/menu3"/>

        <item
            android:id="@+id/menu4"
            android:orderInCategory="4"
            android:showAsAction="never"
            android:title="@string/menu4"/>
      </group>
  </menu>

opState值在Name中设置,如下所示:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle presses on the action bar items
    SharedPreferences.Editor editor = sharedpreferences.edit();
    switch (item.getItemId()) {
        case R.id.menu1:
            map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
            editor.putInt(Name, 1);
            editor.apply();
            item.setChecked(!item.isChecked());
            break;

1 个答案:

答案 0 :(得分:0)

请尝试一下:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    private int getMenuIdByIndex(int index) {
        // index from 1
        switch (index) {
            case 1:
                return R.id.menu1;
            case 2:
                return R.id.menu2;
            case 3:
                return R.id.menu3;
            case 4:
                return R.id.menu4;
        }

        return 0;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main_actions, menu);

        int savedIndex = PreferenceManager.getDefaultSharedPreferences(this).getInt("NAME", 1);
        for (int i = 1; i < 5; i++) {
            MenuItem item = menu.findItem(getMenuIdByIndex(i));
            if (item != null) {
                item.setChecked(i == savedIndex);
            }
        }

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle presses on the action bar items
        switch (item.getItemId()) {
            case R.id.menu1:
                item.setTitle("1");
                item.setChecked(!item.isChecked());
                PreferenceManager.getDefaultSharedPreferences(this).edit().putInt("NAME", 1).apply();
                return true;
            case R.id.menu2:
                item.setTitle("2");
                item.setChecked(!item.isChecked());
                PreferenceManager.getDefaultSharedPreferences(this).edit().putInt("NAME", 2).apply();
                return true;
            case R.id.menu3:
                item.setTitle("3");
                item.setChecked(!item.isChecked());
                PreferenceManager.getDefaultSharedPreferences(this).edit().putInt("NAME", 3).apply();
                return true;
            case R.id.menu4:
                item.setTitle("4");
                item.setChecked(!item.isChecked());
                PreferenceManager.getDefaultSharedPreferences(this).edit().putInt("NAME", 4).apply();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}