setOnNavigationItemSelectedListener已被弃用

54

目前我正在开发一个具有底部导航栏的应用程序,其中有三个菜单项。我曾使用setOnNavigationItemSelectedListener()方法处理菜单项被点击的事件,但现在我面临该方法已经被弃用的问题。

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

有没有解决方法?是否有比setOnNavigationItemSelectedListener()方法更好的替代方案?


它并未被弃用:https://developer.android.com/reference/com/google/android/material/bottomnavigation/BottomNavigationView#setOnNavigationItemSelectedListener(com.google.android.material.bottomnavigation.BottomNavigationView.OnNavigationItemSelectedListener) - Dinkar Kumar
8个回答

72

根据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;
  }

此外,还可以查看此提交,因为它解释了这个更改引起的混淆:

监听器已被弃用,建议使用NavigationBarView#OnItemSelectedListenerNavigationBarView#OnItemReselectedListener,但是没有添加弃用文档,因此不清楚开发者应该使用什么。


我试过了,它很好用,谢谢。但是在导航项之间切换的速度比 OnNavigationItemSelectedListener 慢了一些。有什么建议可以改进吗?无论如何,感谢您的帮助。 - Jeyasurya
1
或许可以添加一个空的监听器到setOnItemReselectedListener中,这样当项目被重新选择时,setOnItemSelectedListener中的监听器就不会被调用了。 - marcinj

52

您可以尝试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;
        }
    });

Kotlin:

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

6
我们可以使用setOnItemSelectedListener代替setOnNavigationItemSelectedListener,并使用setOnItemReselectedListener代替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
}

5

您可以在Kotlin中使用

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

你为什么在使用setOnItemSelectedListener而不是setOnNavigationItemSelectedListener? - arshcaptano

2
public class HomeActivity extends AppCompatActivity implements NavigationBarView.OnItemSelectedListener {

    BottomNavigationView bottomNavigationView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        bottomNavigationView = findViewById(R.id.bottom_nav);
        bottomNavigationView.setOnItemSelectedListener(this);
        displayfragment(new FragmentHome());

    }

    private void displayfragment(Fragment fragment) {

        getSupportFragmentManager().beginTransaction().replace(R.id.content_area, fragment).commit();


    }

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        Fragment fragment;
        switch (item.getItemId()) {

            case R.id.nav_home:
                fragment = new FragmentHome();
                break;
            case R.id.nav_fav:
                fragment = new FavouriteFragment();
                break;
            case R.id.nav_set:
                fragment = new FragmentSetting();
                break;

            default:
                fragment = new FragmentHome();
                break;

        }
        displayfragment(fragment);
        return true;
    }
}

请解释一下您的解决方案。 - arshcaptano
2
setOnNavigationItemSelectedListener已被弃用,请改用setOnItemSelectedListener(this);。 - Moeenuddin178

1
Kotlin:使用setOnItemSelectedListener。
    bottomNavigationView.setOnItemSelectedListener { item: MenuItem ->
            when (item.itemId) {
                 R.id. ... -> {
                    Add your code
                 true
            }
            
            else ->
                true
        }

2
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

0

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


0
在你的代码中添加以下行:

@SuppressWarnings("deprecation")


你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接