NavigationDrawer menuItem setChecked не работает

я создал BaseActivity с NavigationDrawer из библиотеки дизайна поддержки Android.

public abstract class BaseActivity extends ActionBarActivity {  

final static int MENUITEMS = 5;

private Toolbar toolbar;                              // Declaring the Toolbar Object

NavigationView navigationView;
private DrawerLayout drawerLayout;

Context basecontext;

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

    setContentView(getLayoutId());

/* Assinging the toolbar object ot the view
and setting the the Action bar to our toolbar
 */
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    //Initializing NavigationView

    //Setting Navigation View Item Selected Listener to handle the item click of the navigation menu
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {

        // This method will trigger on item Click of navigation menu
        @Override
        public boolean onNavigationItemSelected(MenuItem menuItem) {


            //Checking if the item is in checked state or not, if not make it in checked state
            if (menuItem.isChecked()) {
                menuItem.setChecked(false);

            } else {
                menuItem.setChecked(true);
                switch (menuItem.getItemId()) {


                    //Replacing the main content with ContentFragment Which is our Inbox View;
                    case R.id.menu_start:
                        Toast.makeText(getApplicationContext(), "Noch nicht implementiert", Toast.LENGTH_SHORT).show();
                        Intent intent = new Intent(BaseActivity.this, Start.class);
                        startActivity(intent);
                        // For rest of the options we just show a toast on click
                        //TODO

                    case R.id.menu_all_entries:
                        Toast.makeText(getApplicationContext(), "Noch nicht implementiert", Toast.LENGTH_SHORT).show();
                    case R.id.menu_missed_entries:
                        Toast.makeText(getApplicationContext(), "Noch nicht implementiert", Toast.LENGTH_SHORT).show();
                    case R.id.menu_diagram:
                        Toast.makeText(getApplicationContext(), "Noch nicht implementiert", Toast.LENGTH_SHORT).show();
                    case R.id.menu_export:
                        Toast.makeText(getApplicationContext(), "Noch nicht implementiert", Toast.LENGTH_SHORT).show();
                    default:
                        Toast.makeText(getApplicationContext(), "Somethings Wrong", Toast.LENGTH_SHORT).show();

                }
            }

            //Closing drawer on item click
            drawerLayout.closeDrawers();
            //String localClassName = getLocalClassName();
            //Check to see which item was being clicked and perform appropriate action
            return true;

        }
    });

Это прекрасно работает.

Теперь у меня есть "Sub"-Activity (ничего не представлено в виде пункта меню).

В этой деятельности:

public class AddEntryPage1 extends BaseActivity {


@Override
protected int getLayoutId(){
    return R.layout.activity_add_entry_page1;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ButterKnife.bind(this);
    for(int i=0;i<MENUITEMS;i++){
        navigationView.getMenu().getItem(0).setChecked(false);
    }
}
}

Я пытался отключить все пункты меню, но ничего не происходит.

Когда я оцениваю выражение

navigationView.getMenu().getItem(0).isChecked()

это всегда верно (до и после for-loop/getItem(0).setChecked(false)) .

Я также не получаю никакой ошибки на этом.

Кажется, у меня нет доступа для записи? Это проблема, что я инициировал свой drawer.xml с выбранным элементом? Когда я нажимаю другой элемент меню, выбранный элемент изменяется, как и ожидалось. Или checkableBehavior="single" означает, что нужно проверить один элемент?

<group android:checkableBehavior="single">

    <item
        android:id="@+id/menu_start"
        android:checked="true"
        android:icon="@drawable/ic_action_home"
        android:title="Start" />

    <item
        android:id="@+id/menu_all_entries"
        android:checked="false"
        android:icon="@drawable/ic_action_view_list"
        android:title="Alle Einträge" />

    <item
        android:id="@+id/menu_missed_entries"
        android:checked="false"
        android:icon="@drawable/ic_action_view_list"
        android:title="Verpasste Einträge" />

    <item
        android:id="@+id/menu_diagram"
        android:checked="false"
        android:icon="@drawable/ic_editor_insert_chart"
        android:title="Diagramm" />


    <item
        android:id="@+id/menu_export"
        android:checked="false"
        android:icon="@drawable/ic_social_share"
        android:title="Export" />

</group>

Спасибо за помощь!


person fighter-ii    schedule 27.08.2015    source источник


Ответы (4)


Для тех, у кого может быть такая же проблема:

Я сообщил о проблеме в Google: https://code.google.com/p/android/issues/detail?id=184089

person fighter-ii    schedule 09.09.2015
comment
Человек Google ответил вам: используйте navigationView.setCheckedItem(id). Идентификатор примечания — это идентификатор ресурса MenuItem, а не индекс. Я только что убедился, что это работает. - person pengguang001; 26.05.2016

Я нашел причину:

странно

navigationView.getMenu().getItem(1).setChecked(false);

активирует/проверяет запись

а также

.setChecked(true) 

также активирует/проверяет его.

Кто-нибудь может воспроизвести это? Может это баг?

person fighter-ii    schedule 28.08.2015
comment
поэтому, когда я нажимаю один и устанавливаю Checked (false), он не активируется (не выделяется), но все равно выбран. Я думаю, для меня это работает, поэтому я бы не сказал, что это ошибка :/ - person RogerParis; 28.08.2015

Как насчет:

попробуй удалить:

 android:checked="false"

и код, который у меня есть, если это поможет:

 navigationView = binding.navigationView;
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(MenuItem menuItem) {
            drawerLayout.closeDrawers();
            int itemId = menuItem.getItemId();
            navigationView.getMenu().findItem(R.id.drawer_5_reasons).setChecked(true);
            return true;
        }
    });
person RogerParis    schedule 27.08.2015
comment
Нет, это не помогает. Как и в моем примере, navigationView.getMenu().findItem(R.id.drawer_5_reasons) находит правильную запись, .isChecked() возвращает true, но когда я вызываю .setChecked(false), запись все еще проверяется (а .isChecked() все равно возвращает true) - person fighter-ii; 28.08.2015
comment
.isCheckable() также возвращает true - person fighter-ii; 28.08.2015
comment
@смотрите мой собственный ответ ниже, думаю, я нашел ошибку. Вы можете проверить/подтвердить/воспроизвести? - person fighter-ii; 28.08.2015

person    schedule
comment
Я хочу снять все элементы при запуске, поэтому onItemClick мне не поможет - person fighter-ii; 28.08.2015