it-swarm.com.de

Android Navigation Drawer über den Registerkarten

Ich verwende die neue Navigationsleiste aus der Support-Bibliothek. Wenn Sie die Schublade zusammen mit Registerkarten verwenden, wird das Schubladenmenü unter den Registerkarten angezeigt (siehe unten). Wie kann ich sicherstellen, dass das Schubladenmenü auf den Registerkarten angezeigt wird. (Es sollte das Schubladenmenü anzeigen, als ob keine Registerkarten vorhanden wären.) 

Schubladenmenü ohne Registerkarten enter image description here

Schubladenmenü mit Registerkarten

enter image description here

26

Ich habe das gleiche Problem und die Antwort, die ich von Roman Nurik (Android-Team) erhielt, ist, dass die Navigationsleiste nicht mit den Aktionsleisten-Registerkarten verwendet werden sollte.

Die Diskussion finden Sie hier: https://plus.google.com/u/1/116515063230772720916/posts/8dWEkFcbTFX

17
David TA

Erstellen Sie ein separates Fragment, z. B. TabsFragment, und fügen Sie das Fragment in den Fragmentcontainer Ihrer Hauptaktivität ein.

Die Registerkarten können mit dem folgenden Code in das Tabulatorfragment eingefügt werden.

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

TabA und TabB sind hier separate Fragmente für die Registerkarten. Sie können Ihre Funktionalität der jeweiligen Registerkarten in entsprechende Fragmente implementieren Referenz: http://developer.Android.com/reference/Android/support/v4/app/FragmentTabHost.html

11
andinrajesh

Ich bin nicht sicher über die Aktionsleisten-Registerkarten, aber Sie können den Pager-Registerkartenstreifen in Kombination mit der Navigationsleiste verwenden, um ein Navigationsmodell zu erhalten, das mit Google Play Music vergleichbar ist. Sehen Sie sich dazu my post an. 

4
Balaji

Die Lösung, die ich verwende, sieht folgendermaßen aus (funktioniert perfekt): Ich verwende Frame-Layout, um Fragmente austauschen zu können, und das Tabbed-Layout ist die Registerkarte des Basisfragments.

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>
1
nuhbye

Ich glaube, es ist zu spät, da die Frage doch immer noch gestellt wurde ... Wenn Sie die Navigationsleiste bereits verwenden und Navigationsregisterkarten verwenden möchten, schließen Sie die beiden Dateien in Ihren Projektordner ein:

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

Fügen Sie im Fragment der Navigationsleiste Folgendes hinzu:

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

Ich hoffe es hilft!!

0
zenith1234

In meiner AppCompatActivity füge ich folgendes hinzu:

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

Und ich nenne das auf dem Symbolleistenmenüsymbol

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

xML-Datei 

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

Sie können die für das Rendern von Registerkarten verantwortliche Ansicht manuell ausblenden:

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

Rufen Sie einfach diese Methode aus Ihrer Implementierung von ActionBarDrawerToggle wie folgt auf:

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

Diese Lösung funktioniert einwandfrei, wenn Sie ActionBar verwenden. Registerkarten auf engem Bildschirm (Registerkarten werden UNBESCHRIESSLICH ActionBar angezeigt). Wenn Sie jedoch alle anderen Navigationsszenarien behandeln möchten (NavigationMode: List, CustomNavigationView oder Tabs werden direkt in ActionBar angezeigt), muss die erste Methode alle diese Möglichkeiten berücksichtigen:

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
Štarke

Die WordPress-Android-Version enthält eine Implementierung des von Ihnen angegebenen Problems.

Sie entwickelten eine mimische Version von TabView mit dem Namen "HorizontalTabView". Warum sie das machen, ist genau das, was Sie (auch ich) brauchen.

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

Verwandte Quelle:

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

Hoffe, dieser Tipp hilft.

0
kencoder