2015-07-14 9 views
11

Próbuję użyć NavigationView z biblioteki projektowania wsparcia Android w mojej aplikacji. Z jakiegoś powodu odbiornik OnNavigationItemSelected nie jest wywoływany. Oto mój kodNavigationView OnNavigationItemSelectedListener nie jest wywoływany

Układ aktywny

<android.support.design.widget.NavigationView 
    android:id="@+id/navigation_view" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    app:headerLayout="@layout/drawer_header" 
    app:menu="@menu/drawer_menu" /> 

     <FrameLayout 
      android:id="@+id/content_frame" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 

aktywny onCreate()

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(getLayoutID()); 

    toolbar = (Toolbar) findViewById(R.id.activity_toolbar); 
    setSupportActionBar(toolbar); 
    toolbar.inflateMenu(R.menu.common_menu); 
    final ActionBar actionBar = getSupportActionBar(); 
    if (actionBar != null) { 
     actionBar.setHomeAsUpIndicator(R.drawable.ic_menu_white_24dp); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
    } 

    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    navigationView = (NavigationView) findViewById(R.id.navigation_view); 
    navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { 
     @Override 
     public boolean onNavigationItemSelected(final MenuItem menuItem) { 
      Snackbar.make(contentLayout, menuItem.getTitle() + " pressed", Snackbar.LENGTH_LONG).show(); 
      menuItem.setChecked(true); 
      // allow some time after closing the drawer before performing real navigation 
      // so the user can see what is happening 
      drawerLayout.closeDrawer(GravityCompat.START); 
      mDrawerActionHandler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        navigate(menuItem.getItemId()); 
       } 
      }, DRAWER_CLOSE_DELAY_MS); 
      drawerLayout.closeDrawers(); 
      return true; 
     } 

    }); 
    usernameTextView = (TextView) findViewById(R.id.drawer_header_username);     
    usernameTextView.setText(getAppDContext().getAccount().getUsername()); 
    } 
+0

Czy istnieje powód, aby ustawić dwukrotnie słuchacza na NavigationView? – Luksprog

+0

Ups. Wkleiłem tutaj niewłaściwy kod. Poprawione. Dziękuję za wskazanie. – NinjaCoder

+0

Opublikować swój pełny układ –

Odpowiedz

48

Po dokonaniu xml, należy zanotować NavigationView po Baselayout (FrameLayout, LinearLayout itp ..)

<DrawerLayout> 
    <FrameLayout /> 
    <NavigationView /> 
</DrawerLayout> 
+1

Dzięki, że działa dla mnie. –

+2

Rockstar odpowiedzieć .. dzięki – Siddharth

+1

Wow. Szukałem wiele godzin. Dziękuję Ci. – NorthernLights

5

Twoja aktywność układ główny powinien wyglądać następująco:

<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/navigationDrawer" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <include layout="@layout/activity_main_content" /> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/navigationView" 
     style="@style/NavigationView" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="right" 
     app:headerLayout="@layout/header" 
     app:menu="@menu/menu_drawer"/> 

</android.support.v4.widget.DrawerLayout> 

W tym NavigationView I połączone header.xml i menu_drawer.xml (od folderu menu) na przykład menu_drawer.xml:

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
     <group android:checkableBehavior="single"> 
      <item 
       android:id="@+id/nav1" 
       android:checked="true" 
       android:icon="@drawable/logo" 
       android:title="Navigation item 1"/> 
      <item 
       android:id="@+id/nav2" 
       android:icon="@drawable/logo" 
       android:title="Navigation item 2"/> 
     </group> 
    </menu> 

niż kod Java:

public class ActivityMain extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { 

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

     setUpToolbar(); 
     setUpNavDrawer(); 
    } 

private void setUpNavDrawer() { 
     NavigationView view = (NavigationView) findViewById(R.id.navigationView); 
     mDrawerLayout = (DrawerLayout) findViewById(R.id.navigationDrawer); 
     view.setNavigationItemSelectedListener(this); 
     mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.drawerOpen, R.string.drawerClose); 
     mDrawerLayout.addDrawerListener(mDrawerToggle); 
     mDrawerToggle.syncState(); 
    } 

sprawdzić, czy ta praca dla ciebie. W moim projekcie działa jak urok.

+0

Czy wywołuje onOptionsItemSelected, gdy wybrana jest ikona hamburger? Również gdy wybieram pozycję nawigacji, nie dzwoni ona do słuchacza – NinjaCoder

4

dla mnie to załatwiło sprawę!

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

navigationView.bringToFront();

+0

To powinna być zaakceptowana odpowiedź. – Iorek