まず最初に、この質問が以前ここに表示されたことを知っていますが、たくさん試してみた後、まだ成功しませんでした。 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>
メインレイアウトで、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;
}
};
うまくいけば:)
このコードをマニフェストに追加します。
<application Android:supportsRtl="true">
次に、Oncreateで次のコードを記述します。
getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
わたしにはできる。 ;)
ソリューション
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);
}
}
});
//...
}
引き出しのドキュメントは次のとおりです。左または右から引き出すように構成できるようです。
ドロワーの配置とレイアウトは、ドロワーを左または右から表示するビューのどちら側に対応する子ビューのAndroid:layout_gravity属性を使用して制御されます。 (または、レイアウトの方向をサポートするプラットフォームバージョンで開始/終了します。)
http://developer.Android.com/reference/Android/support/v4/widget/DrawerLayout.html
まず、アプリケーションタグのAppManifest.xmlに次のコードを配置する必要があります。
Android:supportsRtl="true"
次に、activity_main.xmlファイルに次のコードを挿入します。
Android:layout_direction="rtl"
これを見てください: 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);
}
これにより、ホームボタン機能を使用できるようになります。ボタンをアクションバーの右側に移動するには、カスタムアクションアイテムを実装する必要があります。必要に応じて、他のアイテムを使用して動作させることもできます。
次のエラーの主な問題:
絶対重力LEFTでドロワービューが見つかりません
それは、あなたが定義した
Android:layout_gravity="right"
右側のリストビューの場合は、この関数を呼び出して、左側から引き出しを開こうとします。
mDrawerToggle.syncState();
ハンバーガーのアイコンをクリックしてください!
上記の関数にコメントして、@ Rudiが言ったようにメニューの開閉を処理してみてください!
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" />
それは私のために働いた。
この回答 は、ナビゲーションを右から左に開くように設定するのに便利ですが、アイコンを右側に設定する解決策はありません。 このコード は修正できます。最初のパラメータとして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 Studioの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"
RTLから開くことは、ユーザーエクスペリエンスに適していません。ユーザーロケールに応答するようにするには、次の行をDrawerLayoutパラメーターに追加しました。
Android:layoutDirection="locale"
ハンバーガーレイアウトが引き出しの開き方向にも一致するように、AppBarLayoutに追加しました。