首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Android中以编程方式触发onNavigationItemSelected()?

如何在Android中以编程方式触发onNavigationItemSelected()?
EN

Stack Overflow用户
提问于 2017-09-28 04:00:02
回答 3查看 4.5K关注 0票数 2

我有一个导航抽屉,里面有三个菜单项。在我的MainActivity.java中,我将onNavigationItemSelected()侦听器设置为处理单击的导航项。单击时,将显示一个自定义抽屉对话框。

航行抽屉

定制抽屉对话框(平铺层)

MainActivity.java

代码语言:javascript
运行
复制
public boolean onNavigationItemSelected(MenuItem item)
{
    // Create custom drawer dialog
    drawerDialog = new Dialog(MainActivity.this);
    drawerDialog.setContentView(R.layout.dialog_drawer);

    // Handle navigation view item clicks here.
    int selectedItemId = item.getItemId();
    if (selectedItemId == R.id.layerMenu)
    {
        ...
    }
    else if (selectedItemId == R.id.basemapMenu)
    {
        ...
    }
    else if (selectedItemId == R.id.tiledLayerMenu)
    {
        // Setup drawer dialog (Tiled Layers)        
    }

    // Show drawer dialog
    drawerDialog.show();

    ...
    mDrawerLayout.closeDrawer(GravityCompat.START);
    return true;
}

我也有一个自定义通知对话框。当“无数据发现通知”对话框出现时,我有下载按钮,它将打开抽屉对话框(平铺层)。

自定义通知对话框(未找到数据)

现在.。如何触发onNavigationItemSelected() programmatically下载按钮上的?这就是我尝试过但没有成功的地方:

代码语言:javascript
运行
复制
    downloadButton.setOnClickListener(new View.OnClickListener() 
    {
        @Override
        public void onClick(View v) 
        {
            // Trying to click Tiled Layers navigation item here                
            // 1
            //NavigationView navigationView = (NavigationView) findViewById(R.id.mainNavView);
            //navigationView.getMenu().getChildAt(2).performClick();            
            // 2
            //((NavigationMenuItemView) findViewById(R.id.tiledLayerMenu)).callOnClick();            
            // 3
            //onNavigationItemSelected(navigationView.getMenu().getItem(2))); //

            // Close dialog
            noticeDialog.dismiss();
        }
    });

请帮帮我。谢谢。

更新

好的.我只是做一些像like建议的事情,这样就可以了。我将onNavigationItemSelected()中的所有长代码移到新函数showDrawerDialog并传递item id。在按钮点击,我也做同样的。不需要查找MenuItem,只需传递项id。谢谢!

MainActivity.java

代码语言:javascript
运行
复制
public boolean onNavigationItemSelected(MenuItem item)
{
    int selectedItemId = item.getItemId();
    showDrawerDialog(selectedItemId);

    mDrawerLayout.closeDrawer(GravityCompat.START);
    return true;
}

public void showDrawerDialog(final int selectedItemId)
{        
    // Create custom drawer dialog
    drawerDialog = new Dialog(MainActivity.this);
    drawerDialog.setContentView(R.layout.dialog_drawer);

    // Handle navigation view item clicks here.
    //int selectedItemId = item.getItemId();
    if (selectedItemId == R.id.layerMenu)
    {
        ...
    }
    else if (selectedItemId == R.id.tiledLayerMenu)
    {
        // Setup drawer dialog (Tiled Layers)        
    }

    // Show drawer dialog
    drawerDialog.show();
}

单击“下载”按钮,

代码语言:javascript
运行
复制
    downloadButton.setOnClickListener(new View.OnClickListener() 
    {
        @Override
        public void onClick(View v) 
        {
            // Trying to click Tiled Layers navigation item here                
            showDialogDrawer(R.id.tiledLayerMenu);

            // Close dialog
            noticeDialog.dismiss();
        }
    });
EN

回答 3

Stack Overflow用户

发布于 2017-09-28 05:13:27

你可以用这个技巧

小变化onNavigationItemSelected(MenuItem item)

首先声明一个int类变量。

代码语言:javascript
运行
复制
//clicked id holder
int clicked = 0;

现在在onNavigationItemSelected(MenuItem item)中使用它

代码语言:javascript
运行
复制
public boolean onNavigationItemSelected(MenuItem item)
{

  int selectedItemId = item.getItemId();
  if (selectedItemId == R.id.layerMenu || clicked == R.id.layerMenu)
  {
    //your  action code
  }
  else if (selectedItemId == R.id.tiledLayerMenu || clicked == R.id.tiledLayerMenu)
  {
    // your  action code       
  }
  //clear clicked value
  clicked = 0;

  mDrawerLayout.closeDrawer(GravityCompat.START);
  return true;
}

在单击按钮中进行编辑

代码语言:javascript
运行
复制
downloadButton.setOnClickListener(new View.OnClickListener() 
{
    @Override
    public void onClick(View v) 
    {
        //setting id to clicked variable 
        clicked  = R.id.m_layerMenu;
        //fire the  navigation selection
       onNavigationItemSelected(navigationView.getMenu().getItem(0));
    }
});

我帮你做测试..。它100%起作用..。试试..。祝好运。

票数 1
EN

Stack Overflow用户

发布于 2019-06-05 10:20:26

这很容易,一号线回答!

代码语言:javascript
运行
复制
onNavigationItemSelected(navigationView.getMenu().findItem(R.id.my_id));
票数 1
EN

Stack Overflow用户

发布于 2021-02-02 10:16:28

您可以在android的任何菜单上尝试这种方法。

代码语言:javascript
运行
复制
yourMenu.performIdentifierAction(menuItemId, flags)

根据标志的不同,您可以选择是否关闭菜单主机。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46460752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档