web-dev-qa-db-ja.com

ナビゲーションドロワーを右から左に開くように設定する方法

まず最初に、この質問が以前ここに表示されたことを知っていますが、たくさん試してみた後、まだ成功しませんでした。 Android Developers site のサンプルに取り組んでいます。

例での実装方法(左から右)ではなく、右から左に開くようにメニューを設定しようとしています。さらに、メニューを開くボタンをアクションバーの右側に移動します。ここでもいくつかの回答を赤くしています。たとえば、 この回答では です。

ビューとレイアウトの重力を変更しようとしましたが、エラーが発生しました:

絶対重力LEFTでドロワービューが見つかりません

メニューを右から開き、アクションバーのボタンを右側に移動するために、コードの問題点を特定し、何を変更すればよいかを教えてください。

xmlコードは次のとおりです。

<Android.support.v4.widget.DrawerLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/drawer_layout"
    Android:layout_gravity="right"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent" >

    <FrameLayout
        Android:id="@+id/content_frame"
        Android:layoutDirection="rtl"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        />

    <ListView Android:id="@+id/left_drawer"
        Android:layout_width="200dp"
        Android:layout_height="match_parent"
        Android:layout_gravity="right"
        Android:choiceMode="singleChoice"
        Android:divider="@Android:color/transparent"
        Android:dividerHeight="10dp"
        Android:background="#111"/>

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

メインレイアウトで、ListView重力を右に設定します。

Android:layout_gravity="right" 

あなたのコードでも:

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            R.drawable.ic_drawer, R.string.drawer_open,
            R.string.drawer_close) {

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item != null && item.getItemId() == Android.R.id.home) {
            if (mDrawerLayout.isDrawerOpen(Gravity.RIGHT)) {
                mDrawerLayout.closeDrawer(Gravity.RIGHT);
            } 
            else {
                mDrawerLayout.openDrawer(Gravity.RIGHT);
            }
        }
        return false;
    }
};

うまくいけば:)

149
Rudi

このコードをマニフェストに追加します。

<application Android:supportsRtl="true">

次に、Oncreateで次のコードを記述します。

getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);

わたしにはできる。 ;)

56
Amir Bax

ソリューション


your_layout.xml:

<?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="end">

    <include layout="@layout/app_bar_root"
        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:itemTextColor="@color/black"
        app:menu="@menu/activity_root_drawer" />

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

YourActivity.Java:

@Override
protected void onCreate(Bundle savedInstanceState) {
//...
toolbar = (Toolbar) findViewById(R.id.toolbar);

drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
            this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();

toolbar.setNavigationOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (drawer.isDrawerOpen(Gravity.RIGHT)) {
                drawer.closeDrawer(Gravity.RIGHT);
            } else {
                drawer.openDrawer(Gravity.RIGHT);
            }
        }
    });
//...
}
35
Volodymyr Kulyk

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

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

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

2
KickAss

まず、アプリケーションタグのAppManifest.xmlに次のコードを配置する必要があります。

Android:supportsRtl="true"

次に、activity_main.xmlファイルに次のコードを挿入します。

Android:layout_direction="rtl"
2

これを見てください: DrawerLayoutフォームでExpandableListViewを右から左にスライド

ActionBarDrawerToggleが実装されていると仮定します。これは、ActionBarDrawerToggleオブジェクト内のonOptionsItemSelected(MenuItem item)メソッドを次のようにオーバーライドすることです。

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item != null && item.getItemId() == Android.R.id.home) {
            if (mDrawer.isDrawerOpen(Gravity.RIGHT)) {
                mDrawer.closeDrawer(Gravity.RIGHT);
            } else {
                mDrawer.openDrawer(Gravity.RIGHT);
            }
            return true;
        }
        return false;
    }

アクティビティのonOptionsItemSelected(MenuItem item)から確認して呼び出します:

@Override
public boolean onOptionsItemSelected(MenuItem item) {

if(mDrawerToggle.onOptionsItemSelected(item)) {
    return true;
}

return super.onOptionsItemSelected(item);
}

これにより、ホームボタン機能を使用できるようになります。ボタンをアクションバーの右側に移動するには、カスタムアクションアイテムを実装する必要があります。必要に応じて、他のアイテムを使用して動作させることもできます。

2
d370urn3ur

次のエラーの主な問題:

絶対重力LEFTでドロワービューが見つかりません

それは、あなたが定義した

Android:layout_gravity="right"

右側のリストビューの場合は、この関数を呼び出して、左側から引き出しを開こうとします。

mDrawerToggle.syncState();

ハンバーガーのアイコンをクリックしてください!

上記の関数にコメントして、@ Rudiが言ったようにメニューの開閉を処理してみてください!

2
par4301

navigationviewの重力を変更することでこの問題を解決しました

Android:layout_gravity

toendstartの代わりに

<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"
        app:menu="@menu/activity_drawer" />

それは私のために働いた。

2

この回答 は、ナビゲーションを右から左に開くように設定するのに便利ですが、アイコンを右側に設定する解決策はありません。 このコード は修正できます。最初のパラメータとしてdrawerを、2番目のパラメータとしてViewCompat.LAYOUT_DIRECTION_RTLを指定すると、階層レイアウトはRTLに設定されます。これは迅速かつ簡単な解決策ですが、メニューを右から左に開き、アイコンを右側に設定するだけの場合、正しい解決策になるとは思いません。 (ただし、それは目的によって異なります。)ただし、toolbarの代わりにdrawerを指定することをお勧めします。このようにして、ツールバーだけがRTLになりました。したがって、これら2つの答えを組み合わせることで、望みどおりの結果が得られると思います。

これらの説明によると、コードは次のようになります。

(これらの行をonCreateメソッドに追加します)

final DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); // Set it final to fix the error that will be mention below.

    ViewCompat.setLayoutDirection(toolbar, ViewCompat.LAYOUT_DIRECTION_RTL);

    toolbar.setNavigationOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (drawer.isDrawerOpen(Gravity.RIGHT))
                drawer.closeDrawer(Gravity.RIGHT);
            else
                drawer.openDrawer(Gravity.RIGHT);
        }
    });

引き出しを最終的にする必要があることに注意してください。そうしないと、このエラーが発生します。

変数 'drawer'は内部クラス内からアクセスされ、finalとして宣言する必要があります

endメソッドでstartの代わりにonNavigationItemSelectedを使用することを忘れないでください:

drawer.closeDrawer(GravityCompat.END);

そして、あなたのactivity_main.xmlで

<Android.support.v4.widget.DrawerLayout 
   Android:id="@+id/drawer_layout"
   tools:openDrawer="end">

   <Android.support.design.widget.NavigationView
      Android:id="@+id/nav_view"
      Android:layout_gravity="end"/>
</Android.support.v4.widget.DrawerLayout>

Android St​​udioのNavigation Drawerアクティビティの例を次のように変更しました。サポートライブラリ25.3.1。

MainActivity.Java:

private DrawerLayout mDrawerLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    ActionBar actionBar = getSupportActionBar();
    if (actionBar != null) {
        actionBar.setDisplayHomeAsUpEnabled(true);
    }

    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);

    NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
    navigationView.setNavigationItemSelectedListener(this);
}

@Override
public void onBackPressed() {
    if (mDrawerLayout.isDrawerOpen(GravityCompat.END)) {
        mDrawerLayout.closeDrawer(GravityCompat.END);
    } else {
        super.onBackPressed();
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int itemId = item.getItemId();
    switch (itemId) {
        case Android.R.id.home:
            finish();
            return true;

        case R.id.action_right_drawer:
            if (mDrawerLayout.isDrawerOpen(GravityCompat.END)) {
                mDrawerLayout.closeDrawer(GravityCompat.END);
            } else {
                mDrawerLayout.openDrawer(GravityCompat.END);
            }
            return true;

        default:
            return super.onOptionsItemSelected(item);
    }
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    // Handle navigation view item clicks here.

    mDrawerLayout.closeDrawer(GravityCompat.END);
    return true;
}

main.xml(ic_menu_white_24pxを https://material.io/icons/ からダウンロード):

<?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto">
    <item Android:id="@+id/action_right_drawer"
        Android:title="Drawer menu"
        Android:icon="@drawable/ic_menu_white_24px"
        Android:orderInCategory="100"
        app:showAsAction="always" />
</menu>

Activity_main.xmlでの変更

Android:layout_gravity="start"

Android:layout_gravity="end"
1

RTLから開くことは、ユーザーエクスペリエンスに適していません。ユーザーロケールに応答するようにするには、次の行をDrawerLayoutパラメーターに追加しました。

Android:layoutDirection="locale"

ハンバーガーレイアウトが引き出しの開き方向にも一致するように、AppBarLayoutに追加しました。

1
Arbel Israeli