web-dev-qa-db-ja.com

Android-右側からのナビゲーションドロワーは可能ですか?

http://developer.Android.com/training/implementing-navigation/nav-drawer.html

このドキュメントによると、引き出しを右手側から実装できるかどうかについては言及していません。それも可能ですか? :(

62
user2062024

引き出しのドキュメントは次のとおりです。左または右から引き出すように構成できるようです。

ドロワーの配置とレイアウトは、ドロワーを左または右から表示するビューのどちら側に対応する子ビューのAndroid:layout_gravity属性を使用して制御されます。 (または、レイアウトの方向をサポートするプラットフォームバージョンで開始/終了します。)

http://developer.Android.com/reference/Android/support/v4/widget/DrawerLayout.html

46
Larry McKenzie

NavigationDrawerは、左、右、または両方から引き出すように構成できます。キーは、XML宣言でのドロワーの表示順序と、layout_gravity属性です。以下に例を示します。

<Android.support.v4.widget.DrawerLayout
    Android:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <FrameLayout
        Android:id="@+id/content"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:baselineAligned="false" >
    </FrameLayout>

    <!-- Left drawer -->

    <ListView
        Android:id="@+id/left_drawer"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_gravity="left"
        Android:choiceMode="singleChoice" />

    <!-- Right drawer -->

    <ListView
        Android:id="@+id/right_drawer"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_gravity="right"
        Android:choiceMode="singleChoice" />
</Android.support.v4.widget.DrawerLayout>
66
Jeshurun

「重力LEFTでドロワービューが見つかりません」エラーでアプリがクラッシュしました。

これをonOptionsItemSelectedに追加しました:

if (item != null && item.getItemId() == Android.R.id.home) {
        if (mDrawerLayout.isDrawerOpen(Gravity.RIGHT)) {
            mDrawerLayout.closeDrawer(Gravity.RIGHT);
        } else {
            mDrawerLayout.openDrawer(Gravity.RIGHT);
        }
    }
24
amalBit

https://stackoverflow.com/a/21781710/437039 ソリューションに追加します。

Android St​​udioによって作成されたNavigation Drawerプロジェクトを使用している場合、onOptionsItemSelectedで状況が変わります。彼らは子クラスを作成したので、このコードを使用する必要があります

if (item != null && id == Android.R.id.home) {
        if (mNavigationDrawerFragment.isDrawerOpen(Gravity.RIGHT)) {
            mNavigationDrawerFragment.closeDrawer(Gravity.RIGHT);
        } else {
            mNavigationDrawerFragment.openDrawer(Gravity.RIGHT);
        }
        return true;
}

次。クラスNavigationDrawerFragmentでは、3つのメソッドを作成する必要があります。

方法1

public boolean isDrawerOpen(int gravity) {
    return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(gravity);
}

方法2

public void closeDrawer(int gravity) {
    mDrawerLayout.closeDrawer(gravity);
}

方法3

public void openDrawer(int gravity) {
    mDrawerLayout.openDrawer(gravity);
}

今だけ、右側の引き出しが機能します。

5
sandalone

マテリアルデザインのNavigationViewを使用できます。例:

<?xml version="1.0" encoding="utf-8"?>
<Android.support.v4.widget.DrawerLayout 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:id="@+id/drawer_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" />

    <Android.support.design.widget.NavigationView
        Android:id="@+id/nav_view"
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_gravity="end"
        Android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</Android.support.v4.widget.DrawerLayout>

完全なチュートリアルについては、 http://v4all123.blogspot.in/2016/03/simple-example-of-navigation-view-on.html を参照してください。

3
Gunaseelan

これは古い質問ですが、まだ答えを探している人にとっては:

はい、可能です。以下のリンクで私の答えを確認してください:

https://stackoverflow.com/a/19358114/1572408

1
Rudi

次に、これらのコードを使用します@amalこれはあなたを助けると思います。 XML:

<!-- Framelayout to display Fragments -->

<FrameLayout
    Android:id="@+id/frame_container"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <RelativeLayout
        Android:layout_width="match_parent"
        Android:layout_height="48dp"
        Android:background="@drawable/counter_bg" >

        <ImageView
            Android:id="@+id/iconl"
            Android:layout_width="25dp"
            Android:layout_height="wrap_content"
            Android:layout_gravity="left"
            Android:layout_marginLeft="12dp"
            Android:layout_marginRight="12dp"
            Android:src="@drawable/ic_launcher" />

        <ImageView
            Android:id="@+id/iconr"
            Android:layout_width="25dp"
            Android:layout_height="wrap_content"
            Android:layout_alignParentRight="true"
            Android:layout_alignParentTop="true"
            Android:layout_marginRight="17dp"
            Android:src="@drawable/ic_launcher" />
    </RelativeLayout>
</FrameLayout>

<!-- Listview to display slider menu -->

<ListView
    Android:id="@+id/list_slidermenu"
    Android:layout_width="240dp"
    Android:layout_height="match_parent"
    Android:layout_gravity="start"
    Android:background="@color/list_background"
    Android:choiceMode="singleChoice"
    Android:divider="@color/list_divider"
    Android:dividerHeight="1dp"
    Android:listSelector="@drawable/list_selector" />

<ListView
    Android:id="@+id/list_slidermenu2"
    Android:layout_width="240dp"
    Android:layout_height="match_parent"
    Android:layout_gravity="end"
    Android:background="@color/list_background"
    Android:choiceMode="singleChoice"
    Android:divider="@color/list_divider"
    Android:dividerHeight="1dp"
    Android:listSelector="@drawable/list_selector" />

//必要な画像を設定します

アクティビティコード:

ImageView iconl,iconr;

private DrawerLayout mDrawerLayout;
private ListView mDrawerList,mDrawerList2;

ImageView iconl,iconr;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    iconl = (ImageView)findViewById(R.id.iconl);
    iconr = (ImageView)findViewById(R.id.iconr);

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
    mDrawerList2 = (ListView) findViewById(R.id.list_slidermenu2);
    mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
    mDrawerList2.setOnItemClickListener(new SlideMenuClickListener());
    iconl.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            mDrawerLayout.openDrawer(Gravity.START);
            mDrawerLayout.closeDrawer(Gravity.END);
        }
    });
    iconr.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            mDrawerLayout.openDrawer(Gravity.END);
            mDrawerLayout.closeDrawer(Gravity.START);
        }
    });
}
}

ここで、両方のリストに独自のリストアダプターを設定し、項目をクリックしてdisplayView(position)を呼び出すことができます。フラグメントをフレームレイアウトに追加できるメソッド。

/**
 * Diplaying fragment view for selected nav drawer list item
 * */
private void displayView(int position) {
    // update the main content by replacing fragments
    Fragment fragment = null;
    switch (position) {
    case 0:
        fragment = new HomeFragment();
        break;


    default:
        break;
    }

    if (fragment != null) 
    {
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction()
        .replace(R.id.frame_container, fragment).commit();

        // update selected item and title, then close the drawer
        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);

        mDrawerLayout.closeDrawer(mDrawerList);
    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }
}
1
Rohit Goswami

画面の右側からナビゲーションドロワーを設定するには、ナビゲーションビューのドロワーレイアウトを親にし、ナビゲーションビューのレイアウトの重力を右側に設定します。

0
Vikash Sharma