2013-05-23 16 views
27

Używam nowej szuflady nawigacji dostępnej w bibliotece pomocy. Podczas korzystania z szuflady razem z zakładkami menu szuflady jest wyświetlane poniżej zakładek, jak pokazano poniżej. Jak mogę się upewnić, że menu szuflady jest wyświetlane na kartach. (Należy wyświetlić menu szuflady, jak gdyby nie ma zakładki)Szuflada nawigacji Android na kartach

menu szuflady bez zakładek enter image description here

menu Szuflada z kartami

enter image description here

Odpowiedz

18

Mam ten sam problem i odpowiedź, Dostałem od Romana Nurika (zespół z Androidem), że szuflady nawigacji nie należy używać z zakładkami Pasek działań.

Dyskusję można znaleźć tutaj: https://plus.google.com/u/1/116515063230772720916/posts/8dWEkFcbTFX

+4

Więc co jest app gry google za pomocą ? jeśli wybierzesz Moje gry w szufladzie, pokaże ona podgląd ze wskaźnikami, a jeśli naciśniesz ponownie szufladę, pojawi się nad podglądem ze wskaźnikami. – Maxrunner

+12

To już 8 miesięcy później, a wiele aplikacji Google nadal używa kart i szuflady nawigacji (przynajmniej Play, Music i YouTube), więc domyślam się, że ta rada nie jest już istotna. –

+6

@dpk W rzeczywistości cały cytat brzmi: "Nie powinieneś używać szuflady nawigacji z zakładkami paska akcji. Jeśli chcesz mieć interfejs podobny do Google Play Music, powinieneś zaimplementować karty ręcznie." Więc można używać kart z szufladą, a nie kart akcji. W aplikacji Muzyka widać, że używają one stylu nawigacji obrotowej na pasku akcji dla "Wszystkie utwory muzyczne" i "Na urządzeniu", więc oczywiste jest, że karty w Bibliotece nie mogą być "zakładkami paska akcji", ale raczej niestandardowe wbudowane zakładki, które nie są zbyt trudne. – Henry

4

nie jestem pewien o kartach Action Bar, ale można użyć Pager Tab Strip w połączeniu z szuflady nawigacji, aby uzyskać modelu nawigacji podobny jak Muzyka Google Play, mają spójrz na: my post

11

Utwórz osobny fragment, powiedz TabsFragment i dodaj fragment wewnątrz kontenera fragmentu w głównej aktywności.

Zakładki można dodawać wewnątrz fragmentów kart z następującym kodem.

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

Tutaj TabA i TabB są oddzielnymi fragmentami kart. Możesz wdrożyć funkcjonalność odpowiednich zakładek w odpowiednich fragmentach. Odniesienie: http://developer.android.com/reference/android/support/v4/app/FragmentTabHost.html

-1

Pasek czynności Uchwyt szuflady i SwipeTabs nie mogą być używane jednocześnie. Powinieneś zaimplementować szufladę nawigacyjną za pomocą Actionbar i swipetabów za pomocą prostych Tabhostów. Możesz użyć Tabhost dla kart i użyć fragmentów do widoku wewnątrz każdej Tabury. Fragmenty powinny być używane przez Viewpager, aby zapewnić efekt przewijania/przesuwania. Podłącz zaczepy i viewpager z siebie nawzajem poprzez ich metod

<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 działa tylko z działaniami. Musisz użyć FragmentTabHost na fragmenty. Również ViewPager nie może zostać umieszczony w miejscu, które pokazałeś! – TechSpellBound

0

Można ukryć View odpowiedzialnym za renderowanie zaczepy 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 
    } 
} 

Wystarczy wywołać tę metodę z realizacji ActionBarDrawerToggle tak:

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

To rozwiązanie będzie działało dobrze, jeśli używasz ActionBar.Tabs na wąskim ekranie (karty są wyświetlane automatycznie PONIŻEJ ActionBar). Ale jeśli chcesz, aby obsłużyć wszystkie inne scenariusze nawigacyjnych (NavigationMode: Lista, CustomNavigationView lub Tabs są wyświetlane bezpośrednio w ActionBar), pierwsza metoda musi obsłużyć wszystkie te możliwości:

wersję
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 posiada implementację problem, który podałeś.

Opracowali naśladowczą wersję TabView o nazwie "HorizontalTabView". Dlaczego robią to dokładnie to samo, czego ty (także ja) potrzebujesz.

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

Powiązane źródło:

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

Nadzieja ta wskazówka pomoże.

1

Oto rozwiązanie, którego używam wygląda (działa perfekcyjnie): Używam układu ramek, aby móc zamienić fragmenty, a układ kart jest zakładkami na fragmencie podstawowym.

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

wierzę, że to zbyt późno, ponieważ padło pytanie, ale nadal. Jeśli już używasz szufladę nawigacji i chcesz zakładki nawigacji, obejmuje dwa pliki w folderze projektu:

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

W fragment szuflady nawigacji, należy wymienić:

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

Mam nadzieję, że pomoże!

0

W moim AppCompatActivity dodam to:

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

I nazywają to na ikonę menu Pasek

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

plik 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> 
Powiązane problemy