2016-03-12 19 views
0

我想设置编程的onOptionsItemSelected(菜单项项)功能, 内检查一个单选按钮,但它不工作和应用程序崩溃!更改编程一个单选按钮,检查里面onOptionsItemSelected

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值在名称设置为这里的部分:

@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; 
+0

什么是崩溃? –

+0

只是通常_App不幸停止working_。 – Archdeacon

+0

兄弟,这是不正确的: “我正在一个真实的设备上测试这个,所以不能运行任何诊断。” 只需通过USB电缆连接设备,您就可以获得您的“诊断”a.k.a.日志,这是我们解决您的问题所需的。请发布错误日志。 – Vucko

回答

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); 
     } 
    } 
} 
+0

非常好!我不知道这究竟是什么,但它似乎工作;虽然可能返回的_opState_值往往默认为4. – Archdeacon

+0

如果您有任何问题,请不要犹豫,问。 opState设置为4,但可以根据需要更改它 – yital9

+0

opState实际上是返回的_sharedPreference_值,其值从1到4不等;并在应用程序启动时分配。 – Archdeacon