setNavigationItemSelectedListener Not Working

Rj_Innocent_Coder picture Rj_Innocent_Coder · Jan 28, 2018 · Viewed 11.6k times · Source

My NavigationView onClick event is not working.

Here are the code snippets I tried one by one, but nothing worked:

  1. Implementing NavigationView.OnNavigationItemSelectedListener using OnClick() Method
  2. Setting NavigationItemSelectedListener method

    nav  = (NavigationView)findViewById(R.id.nav);
    nav.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(MenuItem item) {
            Toast.makeText(getApplicationContext(),"Hello",Toast.LENGTH_SHORT).show();
            return true;
        }
    });
    
  3. Using OnOptionItemSelected() Method

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    if(toggle.onOptionsItemSelected(item))
    {
        return true;
    }
    switch (item.getItemId()) {
        case R.id.lib:
    
            Toast.makeText(getApplicationContext(),"OK",Toast.LENGTH_SHORT).show();
            return true;
    
        case R.id.fav:
            Toast.makeText(getApplicationContext(),"OK",Toast.LENGTH_SHORT).show();
    
            return true;
    }
    return super.onOptionsItemSelected(item);
    }
    

I also tried all these question and blogs relevant to my question but it didn't work.

  1. Navigation Drawer: setNavigationItemSelectedListener is not working.
  2. https://stackoverflow.com/questions/47242960/navigationview-setnavigationitemselectedlistener
  3. onNavigationItemSelected not working in NavigationView

Here is my Complete MainActivity.java file:

public class MainActivity extends AppCompatActivity{

public frag_song song;
public frag_artist artist;
public  frag_album album;
public TabLayout tab;
Uri songUri;
Cursor songCursor;
public static LinearLayout mainLayout;
int songTitle,songArtist,duration,data,songAlbum;
public NavigationView nav;
public DrawerLayout layout;
public ActionBarDrawerToggle toggle;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ActionBar actionBar = getSupportActionBar();
    actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME);
    //actionBar.setIcon(R.drawable.logo);
    mainLayout = (LinearLayout)findViewById(R.id.main);

    //All Stuff Of NAvigatin Drawer
    layout = (DrawerLayout)findViewById(R.id.drawerL);
    toggle = new ActionBarDrawerToggle(MainActivity.this,layout,R.string.open,R.string.close);
    layout.addDrawerListener(toggle);
    toggle.syncState();
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    nav  = (NavigationView)findViewById(R.id.nav);
    nav.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(MenuItem item) {
            Toast.makeText(getApplicationContext(),"Hello",Toast.LENGTH_SHORT).show();
            return true;
        }
    });//Not Working
    nav.setItemIconTintList(null);

    //check if app open first time or not
    SharedPreferences prefs = this.getSharedPreferences("com.blackhat.rhythmbox", Context.MODE_PRIVATE);
    Boolean first = prefs.getBoolean("first", true);
    if(first){
        //Adding song To  Database
        addtoDatabase();
        prefs.edit().putBoolean("first",false).commit();
    }

    //Decaring Object of Fragment
    //TO access Tab
    tab = (TabLayout)findViewById(R.id.tabs);
    song = new frag_song();
    artist = new frag_artist();
    album = new frag_album();


    //addding tab to tab layout
    tab.addTab(tab.newTab().setText("Songs"),true);
    tab.addTab(tab.newTab().setText("ALbum"));
    tab.addTab(tab.newTab().setText("Artist"));

    tab.getTabAt(0).setIcon(R.drawable.icons_song);
    tab.getTabAt(1).setIcon(R.drawable.icons_album);
    tab.getTabAt(2).setIcon(R.drawable.icon_artist);
    //setting default tab
        FragmentManager fm = getSupportFragmentManager();
        fm.beginTransaction().replace(R.id.frame_container,song).commit();

        //on tab select
        tab.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                switch (tab.getPosition())
                {
                    case 0 :
                        FragmentManager f_song = getSupportFragmentManager();
                        f_song.beginTransaction().replace(R.id.frame_container,song).commit();
                        break;

                    case 1 :
                        FragmentManager f_artist = getSupportFragmentManager();
                        f_artist.beginTransaction().replace(R.id.frame_container,album).commit();
                        break;

                    case 2 :
                        FragmentManager f_album = getSupportFragmentManager();
                        f_album.beginTransaction().replace(R.id.frame_container,artist).commit();
                        break;
                }

            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
    }

@Override
protected void onStop() {
    super.onStop();
}

public void addtoDatabase(){
    song_db dbHelper = new song_db(getApplicationContext());
    SQLiteDatabase db = dbHelper.getWritableDatabase();
    ContentValues contentValues = new ContentValues();

    ContentResolver contentResolver = getContentResolver();
    songUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    songCursor = contentResolver.query(songUri, null, null, null, null);
    //checking if cursor is null or not

    if(songCursor !=null && songCursor.moveToFirst()){
        songTitle = songCursor.getColumnIndex(MediaStore.Audio.Media.TITLE);
        songArtist = songCursor.getColumnIndex(MediaStore.Audio.Media.ARTIST);
        duration = songCursor.getColumnIndex(MediaStore.Audio.Media.DURATION);
        songAlbum = songCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM);
        data = songCursor.getColumnIndex(MediaStore.Audio.Media.DATA);
        Toast.makeText(getApplicationContext(),"Loaded",Toast.LENGTH_SHORT).show();
        do{
            contentValues.put("name",songCursor.getString(songTitle));
            contentValues.put("artist",songCursor.getString(songArtist));
            contentValues.put("album",songCursor.getString(songAlbum));
            contentValues.put("path",songCursor.getString(data));
            contentValues.put("duration",songCursor.getString(duration));
            contentValues.put("isfavorite",0);
            contentValues.put("playlist","regular");
            // contentValues.put("name",songCursor.getString(songArtist));
            db.insert("songs",null,contentValues);
        }while (songCursor.moveToNext());
    }

}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if(toggle.onOptionsItemSelected(item))
    {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

}

Answer

Ben H picture Ben H · Mar 26, 2018

I had the same problem, and I discovered that Android is VERY particular about the layout XML. I had my NavigationView as the first child of the DrawerLayout, but it has to be the last child for some stupid reason. So your layout must have the elements in this order:

<DrawerLayout>
    <FrameLayout/>
    <NavigationView/>
</DrawerLayout>

NOT in this order:

<DrawerLayout>
    <NavigationView/>
    <FrameLayout/>
</DrawerLayout>