web-dev-qa-db-ja.com

ナビゲーションドロワーの開いているメニューをスライドさせるには、任意の場所をタッチします

Jfeinstein10によるスライドメニュー( https://github.com/jfeinstein10/SlidingMen )の場合、アプリ内のどこにでもスライドしてメニューをスライドして開くことができます。

Googleで新しく導入されたナビゲーションドロワー http://developer.Android.com/design/patterns/navigation-drawer.html#side-nav の場合、同様の動作をさせる方法はありますか?

これまでのところ、ドキュメントから見ると、Edgeからスライドするか、アプリのアイコンに触れるだけに制限されていることがわかりました。

ユーザーは、画面の左端からスワイプするか、アクションバーのアプリケーションアイコンをタッチして、ナビゲーションドロワーを画面に表示できます。

22
Cheok Yan Cheng

解決策を見つけました。タッチマージンを構成して、ビューと同じ幅にすることができます。こちらがリンクです

Android Navigation Drawer のドラッグマージンを設定します

10
Maxim Efimov

グーグルは、彼らが彼らのチュートリアル「ユーザーが画面の左端(左から20 dp以内)に触れた場合」の言い方から、彼らはその機能を望んでいないようです。

http://developer.Android.com/design/patterns/navigation-drawer.html を参照してください

「ユーザーは、画面の左端からスワイプするか、アクションバーのアプリケーションアイコンをタッチして、ナビゲーションドロワーを画面に表示できます。」

画面のどこからでも発言したり、スワイプしたりすることはありません。また、アプリ(G +、Gmailなど)にはその機能がないため、その機能が必要な場合は、独自に(ジェスチャーを使用して)またはサードパーティ(jfeinstein10など)を使用することをお勧めします。

編集:Youtubeアプリではどこでもスワイプできますが、少なくとも私が持っているバージョン(4.5.17)では、新しいAPIを使用しているようには見えません。

10
Cheney Hester

これを使えます

DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
Field mDragger = mDrawerLayout.getClass().getDeclaredField(
    "mLeftDragger");//mRightDragger or mLeftDragger based on Drawer Gravity
mDragger.setAccessible(true);
ViewDragHelper draggerObj = (ViewDragHelper) mDragger
    .get(mDrawerLayout);

Field mEdgeSize = draggerObj.getClass().getDeclaredField(
    "mEdgeSize");
mEdgeSize.setAccessible(true);
int Edge = mEdgeSize.getInt(draggerObj);

mEdgeSize.setInt(draggerObj, Edge * 3); 
6
moallemi

他の人が言ったように、そしてチェイニーは彼の答えで言ったように-それは意図されたままにしておくことがおそらく最善です。ただし、DrawerLayoutSlidingMenuとは異なるスタイルです。 Googleはまた、SlidingPaneLayoutを追加しました。これは、SlidingMenuのスタイルにより厳密に一致します。

結局のところ、私が探していたものの方が多かったため、SlidingPaneLayoutをこの方法で実装することになりました。 (これは、YouTube /ハングアウトアプリのスタイルでもあります)

<Android.support.v4.widget.SlidingPaneLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/sliding_pane_layout"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <LinearLayout
            Android:id="@+id/left_pane"
            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"
        Android:layout_weight="1"/>

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

次に、アクションバーのホームボタンで開くには:

getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action buttons
    switch(item.getItemId()) {
        case Android.R.id.home:
            if (mPaneLayout.isOpen())
                mPaneLayout.closePane();
            else
                mPaneLayout.openPane();
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

その後、スライドする/開く/閉じるときに処理するPanelSlideListenerを実装できます。

ナビゲーションドロワーでAdam Powellのシリーズも読むことをお勧めします。パート3では、SlidingPaneLayoutとナビゲーションドロワーの使い方を説明します。

パート1- https://plus.google.com/+AdamWPowell/posts/2zi4DXd3jkm

パート2- https://plus.google.com/+AdamWPowell/posts/VdgexsZeXHW

パート3- https://plus.google.com/+AdamWPowell/posts/8j2GVw72i1E

パート4- https://plus.google.com/+AdamWPowell/posts/TtBFUXhe5H

3
bbedward

GestureDetector を使用してスライドジェスチャーを自分で検出し、 DrawerLayout.openDrawer() メソッドを使用してナビゲーションドロワーを自分で開くだけです。

2
Ridcully