2013-05-23 27 views
27

Sto utilizzando il nuovo cassetto di navigazione disponibile dalla libreria di supporto. Quando si utilizza il cassetto insieme alle linguette, il menu del cassetto viene visualizzato sotto le linguette come mostrato di seguito. Come posso assicurarmi che il menu del cassetto sia mostrato nelle schede. (Dovrebbe visualizzare il menu cassetto come se non ci sono schede)Android Navigation Drawer sopra le schede

menù Cassetto senza linguette enter image description here

menù Cassetto con schede

enter image description here

risposta

18

ho avuto lo stesso problema e la risposta che mi ottenuto da Roman Nurik (team di Android) è che il Navigation Drawer non deve essere utilizzato con le schede della barra delle azioni.

La discussione può essere trovato qui: https://plus.google.com/u/1/116515063230772720916/posts/8dWEkFcbTFX

+4

Allora, qual è il gioco app Google utilizzando ? se selezioni I miei giochi nel cassetto mostrerà un viewpager con indicatori e se premi nuovamente il cassetto comparirà sopra il viewpager con gli indicatori. – Maxrunner

+12

Sono trascorsi 8 mesi e molte app di Google utilizzano ancora schede e un cassetto di navigazione (Play, Musica e YouTube, almeno) quindi suppongo che questo consiglio non sia più pertinente. –

+6

@dpk In realtà, la citazione completa è "Non utilizzare i cassetti di navigazione con le schede della barra delle azioni. Se si sta puntando a un'interfaccia utente simile a quella di Google Play Music, è necessario implementare le schede manualmente". Quindi va bene usare le schede con il cassetto, solo le schede della barra delle azioni. Nell'app Musica, puoi vedere che stanno usando lo stile di navigazione spinner nella barra delle azioni per "Tutta la musica" e "Sul dispositivo", quindi è ovvio che le schede nella Libreria non possono essere "schede della barra delle azioni", ma schede piuttosto personalizzate che non è troppo difficile. – Henry

4

io non sono sicuro di schede Azione bar, ma è possibile utilizzare Pager Striscia Tab in combinazione di navigazione cassetto per ottenere modello di navigazione simile come Google Play Music, hanno un guarda my post

11

Creare un frammento separato dire TabsFragment e aggiungere il frammento all'interno del contenitore di frammenti nell'attività principale.

Le schede possono essere aggiunte all'interno del frammento di schede con il seguente codice.

private FragmentTabHost mTabHost; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    mTabHost = new FragmentTabHost(getActivity()); 
    mTabHost.setup(getActivity(), getChildFragmentManager(), R.id.fragment1); 

    mTabHost.addTab(mTabHost.newTabSpec("TabA").setIndicator("TabA"), 
      TabA.class, null); 
    mTabHost.addTab(mTabHost.newTabSpec("TabB").setIndicator("TabB"), 
      TabB.class, null); 

    return mTabHost; 
} 

Qui, TabA e TabB sono frammenti separati per le schede. È possibile implementare le funzionalità delle rispettive schede nei rispettivi frammenti. Riferimento: http://developer.android.com/reference/android/support/v4/app/FragmentTabHost.html

-1

Barra delle azioni Cassetto di navigazione e SwipeTab non possono essere utilizzati contemporaneamente. Dovresti implementare Navigation Drawer usando Actionbar e swipetabs con semplici Tabhosts. È possibile utilizzare Tabhost per le schede e utilizzare i frammenti per la vista interna di ciascuna scheda. I frammenti dovrebbero essere usati tramite viewpager per fornire effetti di scorrimento/scorrimento. Collegare le schede e viewpager con la vicenda attraverso i loro metodi

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<TabHost 
    android:id="@+id/tabHost" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 

     <HorizontalScrollView 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:fillViewport="true" 
      android:scrollbars="none" > 

      <TabWidget 
       android:id="@android:id/tabs" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" > 
      </TabWidget> 
     </HorizontalScrollView> 

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

      <android.support.v4.view.ViewPager 
       android:id="@+id/viewPager_home" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" /> 
     </FrameLayout> 
    </LinearLayout> 
</TabHost> 

+0

TabHost funziona solo con le attività. Devi usare FragmentTabHost per i frammenti. Inoltre, ViewPager non può essere posizionato nella posizione che hai mostrato! – TechSpellBound

0

È possibile nascondere vista responsabile del rendering schede manualy:

public static void setActionBarNavigationVisibility(Activity activity, boolean visible) { 
    // --- If the Tabs are BELOW ActionBar (narrow screens) --- 
    int actionViewResId = Resources.getSystem().getIdentifier("action_bar_container", "id", "android"); // @see http://stackoverflow.com/questions/20023483/how-to-get-actionbar-view 
    View actionBarContainer = activity.findViewById(actionViewResId); // returns instance of com.android.internal.widget.ActionBarContainer (inaccessible) 
    try { 
     Field mTabContainerField = actionBarContainer.getClass().getDeclaredField("mTabContainer"); 
     if (mTabContainerField != null) { 
      mTabContainerField.setAccessible(true); 
      View mmTabContainer = (View) mTabContainerField.get(actionBarContainer); 
      if (mmTabContainer != null) 
       mmTabContainer.setVisibility(visible ? View.VISIBLE : View.GONE); // use GONE, so the mTabContainer below ActionBar does not take space in layout 
     } 
    } catch (Exception e) { 
     // TODO handle exception 
    } 
} 

basta chiamare questo metodo da l'implementazione di ActionBarDrawerToggle come questo:

public void onDrawerSlide(View drawerView, float slideOffset) { 
     super.onDrawerSlide(drawerView, slideOffset); 
     if (slideOffset == 0) { // 0 = drawer is closed    
      setActionBarNavigationVisibility(activity, true); //show Tabs when Drawer is closed    
     } 
    } 

public void onDrawerStateChanged(int newState) { 
     super.onDrawerStateChanged(newState); 
     //hides Tabs right after Drawer starts opening 
     if (DrawerLayout.STATE_DRAGGING == newState || DrawerLayout.STATE_SETTLING == newState) { 
      setActionBarNavigationVisibility(activity, false); 
     } 
    } 

Questa soluzione funzionerà perfettamente se si utilizza ActionBar.Tabs su schermo stretto (le schede vengono visualizzate automaticamente QUI SOTTO ActionBar). Ma se si desidera gestire tutti gli altri scenari di navigazione (NavigationMode: Lista, CustomNavigationView o schede stanno mostrando direttamente in ActionBar), il primo metodo ha bisogno di gestire tutte queste possibilità:

versione
public static void setActionBarNavigationVisibility(Activity activity, boolean visible) { 
    try { 
     /* 1. --- If the navigation items are showing in ActionBar directly. We have 3 options Spinner, Tabs, and CustomNav --- 
     (When Tabs are showing BELOW ActionBar, is handled at the end) */ 
     int actionViewResId = Resources.getSystem().getIdentifier("action_bar", "id", "android"); // @see http://stackoverflow.com/questions/20023483/how-to-get-actionbar-view 
     View actionBarView = activity.findViewById(actionViewResId); // returns instance of com.android.internal.widget.ActionBarView (inaccessible) 
     if (actionBarView != null) { 
      int visibility = visible ? View.VISIBLE : View.INVISIBLE; // not GONE, so it still takes space in ActionBar layout 

      // handle tabs navigation 
      Field mTabScrollViewField = actionBarView.getClass().getDeclaredField("mTabScrollView"); 
      if (mTabScrollViewField != null) { 
       mTabScrollViewField.setAccessible(true); 
       View mTabScrollView = (View) mTabScrollViewField.get(actionBarView); // instance of com.android.internal.widget.ScrollingTabContainerView (inaccessible) 
       if (mTabScrollView != null) 
        mTabScrollView.setVisibility(visibility); 
      } 

      // handle Spinner navigation 
      Field mSpinnerField = actionBarView.getClass().getDeclaredField("mSpinner"); // resp. mListNavLayout 
      if (mSpinnerField != null) { 
       mSpinnerField.setAccessible(true); 
       View mSpinner = (View) mSpinnerField.get(actionBarView); // instance of android.widget.Spinner 
       if (mSpinner != null) 
        mSpinner.setVisibility(visibility); 
      } 

      // handle Custom navigation 
      Field mCustomNavViewField = actionBarView.getClass().getDeclaredField("mCustomNavView"); // resp. mListNavLayout 
      if (mCustomNavViewField != null) { 
       mCustomNavViewField.setAccessible(true); 
       View mCustomNavView = (View) mCustomNavViewField.get(actionBarView); 
       if (mCustomNavView != null) 
        mCustomNavView.setVisibility(visibility); 
      } 
     } 
     // 2. --- If the Tabs are BELOW ActionBar (narrow screens) ---   
     ViewParent actionBarContainer = actionBarView.getParent(); // parent of ActionBarView is com.android.internal.widget.ActionBarContainer (inaccessible) 
     Field mTabContainerField = actionBarContainer.getClass().getDeclaredField("mTabContainer"); 
     if (mTabContainerField != null) { 
      mTabContainerField.setAccessible(true); 
      View mmTabContainer = (View) mTabContainerField.get(actionBarContainer); 
      if (mmTabContainer != null) 
       mmTabContainer.setVisibility(visible ? View.VISIBLE : View.GONE); // now use GONE, so the mTabContainer below Actionbar does not take space in layout 
     } 

    } catch (Exception ex) { 
     // TODO Handle exception...   
    } 
} 
0

WordPress Android avere un'implementazione di il problema che hai affermato.

Hanno sviluppato una versione mimica di TabView denominata "HorizontalTabView". Perché lo fanno è esattamente lo stesso di quello che tu (anche io) abbiamo bisogno.

WordPress github: https://github.com/WordPress/WordPress

fonte correlati:

  • HorizontalTabView.java
  • WPActionBarActivity.java
  • res/theme_browser_activity.xml

Spero che questo suggerimento aiuta.

1

Ecco la soluzione che sto usando sembra (funziona perfettamente): Sto usando il layout del frame per poter scambiare i frammenti e il layout a schede è le schede sul frammento di base.

activity_main.xml

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

    <!--<include--> 
    <!--android:id="@+id/toolbar"--> 
    <!--layout="@layout/toolbar"/>--> 
    <FrameLayout 
     android:id="@+id/content_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <LinearLayout 

      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical"> 

      <android.support.design.widget.TabLayout 
       android:id="@+id/sliding_tabs" 
       android:layout_width="match_parent" 
       scrol 
       android:layout_height="wrap_content"/> 

      <android.support.v4.view.ViewPager 
       android:id="@+id/viewpager" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent"/> 
     </LinearLayout> 
    </FrameLayout> 

    <ListView 
     android:id="@+id/navList" 
     android:layout_width="200dp" 
     android:layout_height="match_parent" 
     android:layout_gravity="left|start" 
     android:background="#ffeeeeee"/> 

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

Credo che sia troppo tardi in quanto questione è stato chiesto, ma ancora. Se si sta già utilizzando cassetto navigazione e desidera schede di navigazione, includere i due file nella cartella del progetto:

1) SlidingTabLayout.java http://developer.android.com/samples/SlidingTabsBasic/src/com.example.android.common/view/SlidingTabLayout.html

2) SlidingTabStrip.java http://developer.android.com/samples/SlidingTabsBasic/src/com.example.android.common/view/SlidingTabStrip.html

Nel frammento del cassetto di navigazione, includere quanto segue:

private SlidingTabLayout mSlidingTabLayout; 
    private SamplePagerAdapter_tasks mPagerAdapter; 
    private ViewPager mViewPager; 

    public void onViewCreated(View view, Bundle savedInstanceState) { 
     // BEGIN_INCLUDE (setup_viewpager) 
     // Get the ViewPager and set it's PagerAdapter so that it can display items 
     //fragment manager of a fragment,Return a private FragmentManager for placing and managing Fragments inside of this Fragment. 

     mPagerAdapter = new SamplePagerAdapter_tasks(getChildFragmentManager(),Titles of Tabs(array of string),Numboftabs (integer)); 
     mViewPager = (ViewPager) view.findViewById(R.id.viewpager); 
     mViewPager.setAdapter(mPagerAdapter); 

     // Give the SlidingTabLayout the ViewPager, this must be done AFTER the ViewPager has had 
     // it's PagerAdapter set. 
     mSlidingTabLayout = (SlidingTabLayout) view.findViewById(R.id.sliding_tabs); 
     mSlidingTabLayout.setDistributeEvenly(true); // this helps to all the tabs on screen to take equal spaces (eg. if 3 tabs each would take one-third of the total space on the screen) 

     mSlidingTabLayout.setViewPager(mViewPager); 

     // END_INCLUDE (setup_slidingtablayout) 
    } 

Spero che aiuti !!

0

Nel mio AppCompatActivity aggiungo questo:

DrawerLayout drawerLayoutMenu =(DrawerLayout) findViewById(R.id.drawer_layout_menu); 
RelativeLayout mDrawerPane =(RelativeLayout) findViewById(R.id.drawerPane); 

E io chiamo questo sull'icona del menu della barra degli strumenti

if (drawerLayoutMenu.isDrawerOpen(mDrawerPane)) { 
    drawerLayoutMenu.closeDrawer(mDrawerPane); 
} else { 
     drawerLayoutMenu.openDrawer(mDrawerPane); 
} 

file xml

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

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

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical"> 

       <android.support.v7.widget.Toolbar 
        android:id="@+id/toolbar" 
        android:layout_width="match_parent" 
        android:layout_height="?attr/actionBarSize" 
        android:background="?attr/colorPrimary" 
        app:layout_scrollFlags="enterAlways" 
        app:popupTheme="@style/AppTheme.PopupOverlay"> 

       </android.support.v7.widget.Toolbar> 

       <android.support.design.widget.TabLayout 
        android:id="@+id/tabs" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content"/> 

       <android.support.v4.view.ViewPager 
        android:id="@+id/container" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent"/> 
      </LinearLayout> 
     </FrameLayout> 

     <!--for menu--> 

     <RelativeLayout 
      android:id="@+id/drawerPane" 
      android:layout_width="270dp" 
      android:layout_height="match_parent" 
      android:orientation="vertical" 
      android:background="#fff" 
      android:layout_gravity="left|start"> 

      <!--you can add a ListView--> 

     </RelativeLayout> 

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