【问题标题】:Android jetpack component - toast on navigation drawer clickAndroid jetpack 组件 - 导航抽屉点击吐司
【发布时间】:2022-03-09 19:31:29
【问题描述】:

我正在使用导航喷气背包并设置了导航抽屉。每件事都很好。但问题是我想在用户单击“nav_share”时显示祝酒词,但没有显示...

这是我制作导航抽屉的方法

DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);

        navigationView.setNavigationItemSelectedListener(this);

        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_plan, R.id.navigation_notifications)
                .setDrawerLayout(drawer)
                .build();

        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);

我的导航抽屉菜单是

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:showIn="navigation_view">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_home"
            android:icon="@drawable/ic_menu_camera"
            android:title="@string/menu_home" />
        <item
            android:id="@+id/nav_gallery"
            android:icon="@drawable/ic_menu_gallery"
            android:title="@string/menu_gallery" />
        <item
            android:id="@+id/nav_slideshow"
            android:icon="@drawable/ic_menu_slideshow"
            android:title="@string/menu_slideshow" />
        <item
            android:id="@+id/nav_tools"
            android:icon="@drawable/ic_menu_manage"
            android:title="@string/menu_tools" />
    </group>

    <item android:title="Communicate">
        <menu>
            <item
                android:id="@+id/nav_share"
                android:icon="@drawable/ic_menu_share"
                android:title="@string/menu_share" />
            <item
                android:id="@+id/nav_send"
                android:icon="@drawable/ic_menu_send"
                android:title="@string/menu_send" />
        </menu>
    </item>

</menu>

终于:

@Override
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {

        int id = menuItem.getItemId();

        if (id == R.id.nav_share)
            Toast.makeText(LauncherActivity.this, "Click", Toast.LENGTH_SHORT).show();

        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

我想要那个点击吐司……我看不到我错过了什么……

【问题讨论】:

  • 尝试调试它
  • 我累了,但是当我这样做时......我的 onNavigationItemSelected(@NonNull MenuItem menuItem) 函数从未执行,尽管我已经完成了 navigationView.setNavigationItemSelectedListener(this); ..
  • NavigationUI.setupWithNavController() 调用在内部调用setNavigationItemSelectedListener() 本身,它会覆盖您之前进行的调用。您的onNavigationItemSelected() 不会被调用,因为导航框架正在处理NavigationView 点击。
  • @MikeM。如果我添加 navigationView.setNavigationItemSelectedListener(this);在我的最后一个 onCreate() 然后显示吐司……但现在我无法导航到我的仪表板、计划或个人资料……我怎样才能显示吐司并能够在我的片段之间导航……你能详细说明一下吗??
  • 对,因为这样您的调用将覆盖NavigationUI.setupWithNavController() 设置的调用。为什么要在那里显示Toast?这肯定不是你最终想要做的,是吗?

标签: android android-jetpack


【解决方案1】:

如果有人想要答案..我做了一些研究,终于找到了解决方案...希望对您有所帮助....

NavigationView navigationView = findViewById(R.id.nav_view);
MenuItem shareItem = navigationView.getMenu().findItem(R.id.nav_share);
shareItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() {
     @Override
     public boolean onMenuItemClick(MenuItem item) {

     Toast.makeText(LauncherActivity.this, "click", Toast.LENGTH_SHORT).show();
     //do as you want with the button click

      DrawerLayout drawer = findViewById(R.id.drawer_layout);
      drawer.closeDrawer(GravityCompat.START);

      return true;
     }
 });

【讨论】:

    【解决方案2】:

    使用这个

     NavigationView navigationView = findViewById(R.id.nav_view);
     navigationView.bringToFront()
     navigationView.setNavigationItemSelectedListener(this);
    

    【讨论】:

      【解决方案3】:

      如果有人还在寻找关于我们如何绑定导航目的地以及处理导航抽屉菜单项的点击的答案,这里已经回答了:https://stackoverflow.com/a/57846680/3283350

      【讨论】:

        【解决方案4】:

        Android Jetpack 导航 - 带有抽屉项的自定义操作

        简单的步骤和容易

        class MainActivity : AppCompatActivity(),NavigationView.OnNavigationItemSelectedListener{
        
            override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
        
            val navView: NavigationView = binding.navView
            navController = findNavController(R.id.nav_host_fragment_content_main)
            navView.setNavigationItemSelectedListener(this)
        
         }
        
         override fun onNavigationItemSelected(item: MenuItem): Boolean {
        
            val url: String? = when (item.itemId) {
                R.id.nav_privacy_policy -> MenuItemUrl.PRIVACY_POLICY
                R.id.nav_term_condition -> MenuItemUrl.TERM_AND_CONDITION
                R.id.nav_contact_us -> MenuItemUrl.CONTACT_US
                R.id.nav_feedback -> MenuItemUrl.FEEDBACK
                R.id.nav_help_support -> MenuItemUrl.HELP_AND_SUPPORT
                R.id.nav_faq -> MenuItemUrl.FAQ
                R.id.nav_about_us -> MenuItemUrl.ABOUT_US
                else -> null
            }
        
            if (url != null) Methods.openBrowser(this@MainActivity, url) // Do anything here ex. show toast etc.
            NavigationUI.onNavDestinationSelected(item, navController)
            drawerLayout.closeDrawer(GravityCompat.START)
            return true
         }
        
        }
        

        【讨论】:

          【解决方案5】:

          我也遇到了你的问题并想出了解决方案

          NavController navController = Navigation.findNavController(this, R.id.nav_host_home);
              NavigationUI.setupWithNavController(navigationView, navController);
          
              navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
                  @Override
                  public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                      int id = menuItem.getItemId();
                      if (id == R.id.nav_share) {
                          Toast.makeText(getApplicationContext(), "nav_share", Toast.LENGTH_SHORT).show();
                      }
                      NavigationUI.onNavDestinationSelected(menuItem, navController);
                      drawerLayout.closeDrawer(Gravity.RIGHT);
                      return true;
                  }
              });
          

          【讨论】:

            猜你喜欢
            • 2020-04-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-14
            • 1970-01-01
            • 1970-01-01
            • 2013-07-04
            • 1970-01-01
            相关资源
            最近更新 更多