【问题标题】:setOnNavigationItemSelectedListener deprecated不推荐使用 setOnNavigationItemSelectedListener
【发布时间】:2021-06-17 14:54:52
【问题描述】:

目前我正在开发一个底部导航栏和三个菜单项的应用程序。我使用setOnNavigationItemSelectedListener() 来表示被点击的项目。但现在我面临该方法已被贬值的问题。

  • 应用语言:Java
  • 问题:'setOnNavigationItemSelectedListener(com.google.android.material.bottomnavigation.BottomNavigationView.OnNavigationItemSelectedListener)' is deprecated

有什么办法可以解决吗?有没有比setOnNavigationItemSelectedListener() 方法更好的替代方法。

【问题讨论】:

标签: java android bottombar


【解决方案1】:

根据 github 来源已弃用:BottomNavigationView.setOnNavigationItemSelectedListener

在其评论中您可以阅读:

@deprecated Use {@link NavigationBarView#setOnItemSelectedListener(OnItemSelectedListener)}
   *     instead.

所以使用其基类中的NavigationBarView.setOnItemSelectedListener

  /**
   * Set a listener that will be notified when a navigation item is selected. This listener will
   * also be notified when the currently selected item is reselected, unless an {@link
   * OnItemReselectedListener} has also been set.
   *
   * @param listener The listener to notify
   * @see #setOnItemReselectedListener(OnItemReselectedListener)
   */
  public void setOnItemSelectedListener(@Nullable OnItemSelectedListener listener) {
    selectedListener = listener;
  }

另见commit

因为它解释了对这一变化的困惑:

监听器已被弃用,取而代之的是 NavigationBarView#OnItemSelectedListenerNavigationBarView#OnItemReselectedListener,但已弃用 从未添加过文档,因此不清楚开发人员应该做什么 改为使用。

【讨论】:

  • 我试过了。它工作正常,谢谢。但是导航项之间的切换速度比OnNavigationItemSelectedListener 慢一些。有什么改进的建议吗?无论如何感谢您的帮助
  • 也许给setOnItemReselectedListener添加空监听器,这样当item被重新选择时你的setOnItemSelectedListener中的监听器不会被调用
【解决方案2】:

你可以试试setonItemSelectedListener。它与setOnNavigationItemSelectedListener()[在 android 11 中测试]

的工作方式相同
bnv.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            int id = item.getItemId();
            switch(id){
              //check id
            }
            return true;
        }
    });

科特林:

bnv.setOnItemSelectedListener { item ->
            when (item.itemId) {
            }
            true
        }

【讨论】:

    【解决方案3】:

    我们可以使用setOnItemSelectedListener 代替setOnNavigationItemSelectedListenersetOnItemReselectedListener 而不是 setOnNavigationItemReselectedListener

    navView.setOnItemSelectedListener {
        // do something
        true
    }
    
    // In case the default menu can be the first menu 
    // Should set the default selected menu BETWEEN setOnItemSelectedListener and setOnItemReselectedListener. 
    // It will make setOnItemSelectedListener fired when you launch app. 
    
    // If you set default menu AFTER setOnItemReselectedListener. 
    // Then setOnItemReselectedListener will fired when you launch app
    navView.selectedItemId = R.id.navigation_home
    
    
    navView.setOnItemReselectedListener {
        // do something
    }
    

    【讨论】:

      【解决方案4】:

       viewBindingMainActivity.navView.setOnItemSelectedListener { menuItem ->
                  if (menuItem.itemId != R.id.navigation_home) {
                      Add your code
                      false
                  } else {
                      Add your code
                      true
                  }
              }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-22
        • 2012-11-14
        • 2019-11-08
        • 2019-11-08
        • 2020-01-03
        • 2011-12-02
        • 2015-01-24
        相关资源
        最近更新 更多