2016-03-12 3 views
0

Я пытаюсь установить программно радиокнопку проверяется внутри onOptionsItemSelected (MenuItem пункта) функции, , но он не работает и приложение вылетает!Изменения программно радио кнопка проверяется внутри 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); 

Я предполагаю, что вышеуказанное установит все кнопки в состояние unchecked. Я тестирую это на реальном устройстве, поэтому не могу выполнить никаких диагностических операций. Ниже проверить значение 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, к сожалению, перестает работать. – Archdeacon

+0

Bro, это неверно: «Я тестирую это на реальном устройстве, поэтому не могу запускать никаких диагностических программ». Просто держите устройство подключенным через 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

Смежные вопросы