Android проверяемое контекстное меню не запоминается проверено - PullRequest
4 голосов
/ 21 марта 2012

У меня есть кнопка, которая открывает контекстное меню со списком различных опций.Одновременно может быть выбран только один вариант, поэтому я хочу, чтобы рядом с каждым из них была указана радиокнопка, выделяющая, какой элемент выбран в данный момент.Когда я выбираю элемент из контекстного меню, выбирается переключатель и закрывается.Как только я нажимаю кнопку, чтобы открыть контекстное меню, ранее выбранный элемент не выбирается.

Как получить контекстное меню, чтобы запомнить, какой элемент был ранее выбран?

Во-вторых, когда действиесначала создается опция по умолчанию.Как установить начальное значение по умолчанию, которое затем может быть перезаписано при выборе другого пункта контекстного меню?Я могу установить android:checked="true" в XML, но можно ли это перезаписать, когда выбран другой элемент?

Java:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.browse);
    Button buttonView = (Button) this.findViewById(R.id.button_view);
    buttonView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            registerForContextMenu(v);
            openContextMenu(v);
        }
    });
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.setHeaderTitle(R.string.menu_title);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_menu, menu);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        case(R.id.item1):
            if(item.isChecked()) {
                item.setChecked(false);
            } else {
                item.setChecked(true);
            }
            break;
        case(R.id.item2):
            if(item.isChecked()) {
                item.setChecked(false);
            } else {
                item.setChecked(true);
            }
            break;
        case(R.id.item3):
            if(item.isChecked()) {
                item.setChecked(false);
            } else {
                item.setChecked(true);
            }
            break;
        default:
            return super.onContextItemSelected(item);
    }
    return true;
}

XML:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:id="@+id/context_menu" android:checkableBehavior="single">
        <item android:id="@+id/item1"
            android:title="@string/context_menu_item1" />
        <item android:id="@+id/item2"
            android:title="@string/context_menu_item2" />
        <item android:id="@+id/item3"
            android:title="@string/context_menu_item3" />
    </group>
</menu>

Любойпомощь будет принята с благодарностью!

Ответы [ 2 ]

15 голосов
/ 21 марта 2012

Проблема в том, что ваши элементы не сохраняют состояние между отображением меню. Поэтому каждый раз, когда вы вызываете setChecked, он работает только для отображаемого в данный момент меню и сбрасывается для следующего.

Вы должны сохранить проверенное состояние во внешней структуре, например, в виде логического массива.

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.setHeaderTitle(R.string.menu_title);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.context_menu, menu);

    // loop for menu items
    for (int i = 0; i < menu.size(); ++i) {
        MenuItem mi = menu.getItem(i);
        // check the Id as you wish
        if (mi.getItemId() == R.id.item2) {
            mi.setChecked(true); 
        }
    }
}

Для поиска пункта меню вы также можете использовать функцию findItem:

MenuItem mi = menu.findItem(R.id.item2)
1 голос
/ 21 марта 2012

Ну, вам нужно где-то сохранить пользовательский ввод и явно установить проверенные состояния после надувания макета.

Кстати, вы можете написать свой переключатель выбранного элемента следующим образом:

switch (item.getItemID()) {
case R.id.item1:
case R.id.item2:
case R.id.item3:
   item.setChecked(!item.isChecked());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...