2015-06-11 10 views
6

Ho recentemente iniziato a convertire la mia app Android per utilizzare l'ultima libreria di supporto denominata supporto: design.Supporto Android: design Elementi sottostanti del menu controllato di NavigationView

Durante l'implementazione del nuovo NavigationView mi sono imbattuto in un problema nella visualizzazione delle voci di menu selezionate.

mio navdrawer_menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<group android:checkableBehavior="single"> 
    <item 
     android:id="@+id/navigation_item_home" 
     android:icon="@drawable/ic_home_black" 
     android:title="@string/navdrawer_item_home" /> 
</group> 

    <item 
     android:id="@+id/navigation_subheader" 
     android:title="@string/navdrawer_subheader_title1"> 
     <menu> 
      <group android:checkableBehavior="single"> 
      <item 
       android:id="@+id/navigation_sub_item1" 
       android:icon="@drawable/ic_home_black" 
       android:title="@string/navdrawer_sub_item1" /> 
      </group> 
     </menu> 
    </item> 
</menu> 

successivo ho impostato voce del menu per controllare nel mio onNavigationItemSelected:

@Override 
public boolean onNavigationItemSelected(final MenuItem menuItem) { 

    menuItem.setChecked(true); 

    drawerLayout.closeDrawer(GravityCompat.START); 
    mDrawerActionHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      displayView(menuItem.getItemId()); 
     } 
    }, DRAWER_CLOSE_DELAY_MS); 
    return true; 
} 

Questa grande opera se io uso solo normali voci di menu tra i tag ma lo fa non funziona molto bene per i sottotitoli. Facendo clic sugli elementi secondari non li imposterai finché non avrò fatto clic due volte sullo stesso elemento e non deselezionerà alcun elemento che è stato controllato in precedenza.

Si finisce per assomigliare a questo:

enter image description here

+0

Questo è un bug della libreria di supporto Android: https://code.google.com/p/android/issues/detail?id=175216 – sromku

risposta

3

ho risolto questo problema ricorrente in questo modo che funziona molto bene.

Dobbiamo semplicemente memorizzare l'ID dell'elemento selezionato, ricaricare il menu in NavigationView e selezionare di nuovo l'elemento.

Per questo è necessario che il cassetto del menu come modo:

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item 
     android:id="@+id/section_1" 
     android:title="@string/section_title"> 

     <menu> 
      <group android:checkableBehavior="single"> 
       <item 
        android:id="@+id/item_1_section_1" 
        android:icon="@drawable/ic_icon" 
        android:title="@string/title"/> 

       <item 
        android:id="@+id/item_2_section_1" 
        android:icon="@drawable/ic_icon" 
        android:title="@string/title"/> 
       ... 
      </group> 
     </menu> 
    </item> 
     ... 
    <item 
     android:id="@+id/section_x" 
     android:title="@string/section_title"> 

     <menu> 
      <group android:checkableBehavior="single"> 
       <item 
        android:id="@+id/item_1_section_x" 
        android:icon="@drawable/ic_icon" 
        android:title="@string/title"/> 

       <item 
        android:id="@+id/item_2_section_x" 
        android:icon="@drawable/ic_icon" 
        android:title="@string/title"/> 
       ... 
      </group> 
     </menu> 
    </item> 
</menu> 

Quindi, la mia soluzione:

public class YourActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { 

... 
private NavigationView mNavigationView; 
private int mNavItemId; 

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

    // load saved navigation state if present 
    if (null == savedInstanceState) { 
     mNavItemId = R.id.item_1_section_1; 
    } else { 
     mNavItemId = savedInstanceState.getInt(NAV_ITEM_ID); 
    } 

    // listen for navigation events 
    mNavigationView = (NavigationView) findViewById(R.id.navigation_view); 
    mNavigationView.setNavigationItemSelectedListener(this); 

    // select the correct nav menu item 
    mNavigationView.getMenu().findItem(mNavItemId).setChecked(true); 
} 

@Override 
public boolean onNavigationItemSelected(final MenuItem menuItem) { 
    // update highlighted item in the navigation menu 
    mNavItemId = menuItem.getItemId(); 

    // allow some time after closing the drawer before performing real navigation 
    // so the user can see what is happening 
    mDrawerLayout.closeDrawer(GravityCompat.START); 
    mDrawerActionHandler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      ... 
     } 
    }, DRAWER_CLOSE_DELAY_MS); 

    // Reload menuDrawer to keep selected item 
    mNavigationView.getMenu().clear(); 
    mNavigationView.inflateMenu(R.menu.menu_drawer); 
    mNavigationView.getMenu().findItem(mNavItemId).setChecked(true); 

    return true; 
} 

... 

} 
+0

Questo sembra fare il lavoro, ma quando Lo faccio, caricherà solo il primo gruppo del menu. Qualche idea? – orelzion

7

Ogni articolo deve essere all'interno di un gruppo, in modo che il gruppo può controllare la voce del comportamento visivo sull'utente seleziona. Provalo:

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
<group android:checkableBehavior="single"> 
    <item 
     android:id="@+id/navigation_item_home" 
     android:icon="@drawable/ic_home_black" 
     android:title="@string/navdrawer_item_home" /> 
    <item 
     android:id="@+id/navigation_subheader" 
     android:title="@string/navdrawer_subheader_title1"> 
     <menu> 
      <group android:checkableBehavior="single"> 
      <item 
       android:id="@+id/navigation_sub_item1" 
       android:icon="@drawable/ic_home_black" 
       android:title="@string/navdrawer_sub_item1" /> 
      </group> 
     </menu> 
    </item> 
</group> 
</menu> 
+0

@JohnVandenBerg se questa o qualsiasi risposta ha risolto la tua domanda ti preghiamo di prendere [accettandolo] (http://meta.stackexchange.com/q/5234/179419) facendo clic sul segno di spunta. Ciò indica alla comunità più ampia che hai trovato una soluzione e dà una certa reputazione sia al rispondente che a te stesso.Non c'è l'obbligo di farlo. – Sufian

3

È semplice. Basta aggiungere android: checkable = "true" per ogni articolo.

per es.

<item 
     android:id="@+id/navigation_item_home" 
     android:icon="@drawable/ic_home_black" 
     android:title="@string/navdrawer_item_home" 
     android:checkable="true" /> 
1

suggerisco di adottare la soluzione fornita da @MichelFortes perché risolto il mio problema con voci di sottomenu in NavigationView. Questo è il mio codice e funziona

<group android:checkableBehavior="single"> 
    <item 
     android:id="@+id/your_id_item" 
     android:icon="@drawable/your_icon_if_you_want" 
     android:title="@string/title_for_this_item" /> 

    <!-- you can add here as many items as you want --> 

</group> 

<item 
    android:title="@string/submenu_title"> 
    <menu> 
     <group android:checkableBehavior="single"> 
      <item 
       android:id="@+id/submenu_item_id" 
       android:icon="@drawable/icon_if_exists" 
       android:title="@string/title_for_item" /> 

      <!-- you can add here as many items as you want --> 

     </group> 
    </menu> 
</item> 

Qui, ogni elemento si seleziona, si sarà controllato e messo in evidenza! Grazie a @MichelFortes nuovamente;)

Problemi correlati