Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

setNavigationItemSelectedListener Not Working

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

}

like image 219
Rj_Innocent_Coder Avatar asked Jan 28 '18 13:01

Rj_Innocent_Coder


3 Answers

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>
like image 101
Ben H Avatar answered Nov 04 '22 10:11

Ben H


This worked for me, to bring the view to the front

navigationView.setNavigationItemSelectedListener(this);
navigationView.bringToFront();
like image 45
Dean Beckerton Avatar answered Nov 04 '22 12:11

Dean Beckerton


If you are getting more issue and want to understand Navigation Drawer things, Create a new project and select Navigation Drawer layout or Checkout below code:

Use below code :

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);



        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

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

        //add this line to display menu1 when the activity is loaded
        displaySelectedScreen(R.id.nav_menu1);
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private void displaySelectedScreen(int itemId) {

        //creating fragment object
        Fragment fragment = null;

        //initializing the fragment object which is selected
        switch (itemId) {
            case R.id.nav_menu1:
                fragment = new Menu1();
                break;
            case R.id.nav_menu2:
                fragment = new Menu2();
                break;
            case R.id.nav_menu3:
                fragment = new Menu3();
                break;
        }

        //replacing the fragment
        if (fragment != null) {
            FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
            ft.replace(R.id.content_frame, fragment);
            ft.commit();
        }

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


    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {

        //calling the method displayselectedscreen and passing the id of selected menu
        displaySelectedScreen(item.getItemId());
        //make this method blank
        return true;
    }


}
like image 1
Abhishek kumar Avatar answered Nov 04 '22 12:11

Abhishek kumar