JeyasuryaUR
JeyasuryaUR

Reputation: 736

setOnNavigationItemSelectedListener deprecated

Currently I am working on an app which has a bottom navbar with three menu items. I had used setOnNavigationItemSelectedListener() for items being clicked. but now iam facing issue that the method has been depreciated.

Is there any way to resolve it? is is there any better alternative than setOnNavigationItemSelectedListener() method.

Upvotes: 59

Views: 54991

Answers (10)

Kirtan
Kirtan

Reputation: 81

bottomNavigationView.setOnNavigationItemSelectedListener is deprecated,

You can use as below in java,

bottomNavigationView.setOnItemSelectedListener(new NavigationBarView.OnItemSelectedListener()
        {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item)
            {
                
            }
        });

For Checking Reselected Items use setOnItemReselectedListener

bottomNavigationView.setOnItemReselectedListener(new NavigationBarView.OnItemReselectedListener()
        {
            @Override
            public void onNavigationItemReselected(@NonNull MenuItem item)
            {
                switch (item.getItemId())
                {
                    
                }
            }
        });

Upvotes: 1

Bilal Asghar
Bilal Asghar

Reputation: 11

Now You Should Use this

**`setOnItemSelectedListener`**

Upvotes: 1

Mahesh Shinde
Mahesh Shinde

Reputation: 27

Add below line in your code @SuppressWarnings("deprecation")

Upvotes: -1

Moeenuddin178
Moeenuddin178

Reputation: 71

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

Upvotes: 4

devio
devio

Reputation: 654

you can use in Kotlin

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

Upvotes: 5

razi
razi

Reputation: 97

kotlin: use setOnItemSelectedListener

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

Upvotes: 1

Linh
Linh

Reputation: 60913

We can use setOnItemSelectedListener instead of setOnNavigationItemSelectedListener and setOnItemReselectedListener instead of 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
}

Upvotes: 7

Royal
Royal

Reputation: 1

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

Upvotes: 0

Abu Saeed
Abu Saeed

Reputation: 1160

you can try setonItemSelectedListener. It is working same as setOnNavigationItemSelectedListener()[tested in 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
        }

Upvotes: 59

marcinj
marcinj

Reputation: 49976

Its deprecated according to github sources: BottomNavigationView.setOnNavigationItemSelectedListener

In its comment you can read:

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

so use NavigationBarView.setOnItemSelectedListener from its base class:

  /**
   * 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;
  }

Also see this commit

as it explains confusion about this change:

The listeners were deprecated in favor of NavigationBarView#OnItemSelectedListener and NavigationBarView#OnItemReselectedListener, but deprecation documentation was never added, so it's unclear what developers should use instead.

Upvotes: 75

Related Questions