【问题标题】:NavigationDrawer menuItem setChecked doesnt work导航抽屉菜单项 setChecked 不起作用
【发布时间】:2015-08-27 10:05:33
【问题描述】:

我使用 Android 支持设计库中的 NavigationDrawer 创建了 BaseActivity。

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;

        }
    });

这很好用。

现在我有一个“子”活动(没有任何东西表示为菜单项)。

在这个活动中:

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)) .

我对此也没有错误。

好像我没有写权限? 我用选定的项目启动了我的抽屉.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>

感谢您帮助我!

【问题讨论】:

    标签: android navigation-drawer menuitem


    【解决方案1】:

    对于可能遇到相同问题的任何人:

    我向 Google 报告了该问题: https://code.google.com/p/android/issues/detail?id=184089

    【讨论】:

    • 谷歌人已经回答了你:使用navigationView.setCheckedItem(id)。注意 id 是 MenuItem 资源 id,而不是索引。我刚刚验证它有效。
    【解决方案2】:
    //The click listner for ListView in the navigation drawer
    private class DrawerItemClickListener implements ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,long id) {
             // update selected item and title, then close the drawer
            mDrawerList.setItemChecked(position, true);
            mDrawerList.setSelection(position);
        }
    }
    

    【讨论】:

    • 我想在启动时取消选中所有项目 - 所以 onItemClick 不会帮助我
    【解决方案3】:

    我找到原因了:

    奇怪

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

    激活/检查条目

    .setChecked(true) 
    

    激活/检查它。

    有人可以复制吗?这可能是一个错误吗?

    【讨论】:

    • 所以当我点击一个并设置检查(false)时,它没有被激活(没有突出显示)但它仍然被选中。我想对我来说它有效,所以我不会说这是一个错误:/
    【解决方案4】:

    怎么样:

    尝试删除:

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

    【讨论】:

    • 不,这没有帮助。在我的示例中,navigationView.getMenu().findItem(R.id.drawer_5_reasons) 找到了正确的条目,.isChecked() 返回 true,但是当我调用 .setChecked(false) 时,条目仍然被检查(并且 .isChecked() 仍然返回 true)
    • .isCheckable() 也返回 true
    • @在下面查看我自己的答案,认为我发现了一个错误。你能检查/确认/复制吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多