проверенные элементы контекстного меню не остаются отмеченными

Я новичок на этом форуме и в самой разработке Android, поэтому мой вопрос, вероятно, будет очень глупым, и я прошу прощения за это. Я начал читать Dev Guide на сайте developer.android.com, и пока не появилась часть с контекстными меню, все работало нормально. Теперь я попытался создать контекстное меню с подменю, которое содержит некоторые проверяемые элементы. Поэтому я добавил подменю и элементы в мой menu.xml и некоторые методы item.setchecked(true) в мой метод onContextItemSelected(...).

меню.xml

<?xml version="1.0" encoding="utf-8"?>  
  <menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/info"
        android:title="@string/info" />
    <item android:title="@string/change">
        <menu>
           <item android:id="@+id/checkable_item1"
               android:checked="true"
               android:checkable="true"
               android:title="@string/hello"/>
           <item android:id="@+id/checkable_item2"
               android:checkable="true"
               android:title="@string/moin"/>
           <item android:id="@+id/checkable_item3"
               android:checkable="true" 
               android:title="@string/aloha"/>
       </menu>
  </item>   
</menu>

часть моего файла .java

...
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
      ContextMenuInfo menuInfo)
{
   super.onCreateContextMenu(menu, v, menuInfo);
   MenuInflater inflater1 = getMenuInflater();
   inflater1.inflate(R.menu.context_menu, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item)
{
   switch(item.getItemId())
   {
   case R.id.checkable_item1:
      if(item.isChecked()) item.setChecked(false);
      else item.setChecked(true);
      return true;
   case R.id.checkable_item2:
      if(item.isChecked()) item.setChecked(false);
      else item.setChecked(true);
      return true;
   case R.id.checkable_item3:
      if(item.isChecked()) item.setChecked(false);
      else item.setChecked(true);
      return true;
   default:
      return super.onContextItemSelected(item);
   }
}
...

Теперь проблема в том, что когда я открываю меню и нажимаю один из проверяемых элементов, я вижу, что зеленая галочка появляется в маленьком поле непосредственно перед закрытием контекстного меню, но когда я снова открываю меню, галочка исчезла. Теперь я действительно не знаю, почему галочка не остается в коробке. Было бы неплохо, если бы кто-нибудь мог дать мне подсказку и сказать, что я делаю неправильно. Благодарим вас заранее

Жан-Клод91


person jean-claude91    schedule 16.01.2011    source источник


Ответы (1)


Я сам не пробовал, но если я правильно прочитаю описание здесь (http://developer.android.com/reference/android/app/Activity.html#onCreateContextMenu(android.view.ContextMenu, android.view.View, android.view.ContextMenu.ContextMenuInfo)) ваш ресурс макета будет вызываться каждый раз при создании меню. Поскольку «небезопасно удерживать меню после возврата метода», вам нужно будет обработать выбранный элемент и сохранить этот выбор где-то, а затем передать текущее состояние выбираемых элементов в onCreate с помощью menuInfo, установив флажок / снятый используя эту информацию.

Если вы этого не сделаете, меню будет каждый раз создаваться заново на основе ваших настроек по умолчанию (menu.xml).

person FFD    schedule 16.01.2011
comment
Хорошо, прежде всего спасибо за ваш ответ. Теперь, как я уже сказал, я новичок в разработке для Android, поэтому не могли бы вы немного подробнее рассказать о том, как сохранить выбор и передать состояния методу onCreate, или дать мне ссылку, которая объясняет, как это сделать, или дать мне имена методов, которые мне нужно искать? Это было бы действительно здорово. - person jean-claude91; 16.01.2011
comment
@jean-claude: Вам нужно прочитать о том, что называется предпочтениями и общими предпочтениями. Ссылки: developer.android.com/reference/android/preference/ и developer.android.com/reference/android/content/ - person user432209; 16.01.2011
comment
отлично. этого должно быть достаточно для меня, чтобы решить эту проблему. большое большое спасибо. это было быстро. - person jean-claude91; 16.01.2011