web-dev-qa-db-ja.com

Androidタブ上のナビゲーションドロワー

サポートライブラリから入手できる新しいナビゲーションドロワーを使用しています。ドロワーをタブと一緒に使用すると、次のようにタブの下にドロワーメニューが表示されます。引き出しメニューがタブに表示されていることを確認するにはどうすればよいですか。 (タブがないかのように引き出しメニューを表示する必要があります)

タブなしの引き出しメニュー enter image description here

タブ付きの引き出しメニュー

enter image description here

26

私は同じ問題を抱えていて、Roman Nurik(Androidチーム)から得た答えは、Navigation DrawerをAction Barタブで使用すべきではないということです。

議論はここで見つけることができます: https://plus.google.com/u/1/116515063230772720916/posts/8dWEkFcbTFX

17
David TA

TabsFragmentという別のフラグメントを作成し、メインアクティビティのフラグメントコンテナ内にフラグメントを追加します。

次のコードを使用して、タブをtabsフラグメント内に追加できます。

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とTabBはタブの個別のフラグメントです。それぞれのフラグメントのそれぞれのタブの機能を実装できます。リファレンス: http://developer.Android.com/reference/Android/support/v4/app/FragmentTabHost.html

11
andinrajesh

Action Barタブについてはわかりませんが、Pager Tab StripをNavigation Drawerと組み合わせて使用​​して、Google Play Musicのようなナビゲーションモデルを取得できます。 my post

4
Balaji

私が使用しているソリューションは次のように見えます(完全に機能します):フレームレイアウトを使用してフラグメントを交換でき、タブレイアウトはベースフラグメントのタブです。

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

質問されてからまだ手遅れだと思います。既にナビゲーションドロワーを使用していて、ナビゲーションタブが必要な場合は、プロジェクトフォルダーに2つのファイルを含めます。

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

ナビゲーションドロワーフラグメントに、次を含めます。

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

それが役に立てば幸い!!

0
zenith1234

私のAppCompatActivityにこれを追加します:

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

そして、これをツールバーメニューアイコンで呼び出します

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

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>

タブを手動でレンダリングするViewを非表示にできます。

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

次のようにActionBarDrawerToggleの実装からこのメソッドを呼び出すだけです:

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

狭い画面でActionBar.Tabsを使用している場合、このソリューションは問題なく機能します(タブはActionBarの下に自動的に表示されます)。ただし、他のすべてのナビゲーションシナリオ(NavigationMode:List、CustomNavigationView、またはTabsがActionBarに直接表示される)をすべて処理する場合、最初のメソッドはこれらすべての可能性を処理する必要があります。

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

WordPress Androidバージョンには、あなたが述べた問題の実装があります。

彼らは、 "Horizo​​ntalTabView"と呼ばれるTabViewの模倣バージョンを開発しました。彼らがこれを行う理由は、あなた(私も)が必要とするものとまったく同じです。

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

関連ソース:

  • Horizo​​ntalTabView.Java
  • WPActionBarActivity.Java
  • res/theme_browser_activity.xml

このヒントがお役に立てば幸いです。

0
kencoder