如何设置导航抽屉从右向左打开

首先我知道这个问题出现在这里之前,但经过很多尝试,我仍然没有成功。 我正在从Android开发者网站的例子工作。

我试图将菜单设置为从右向左打开,而不是如何在示例中执行(从左到右)。 另外,我想将打开的菜单button移动到操作栏的右侧。 我也在这里红一些答案,例如在这个答案 。

我试图改变意见和布局的严重性,但我得到的错误:

没有抽屉视图发现与绝对重力左

你能帮我找出我的代码中有什么问题,为了设置从右侧打开的菜单,并将动作栏button移到右侧,应该改变什么?

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

以下是抽屉上的文档,您可以将其configuration为从左侧或右侧拉出。

抽屉的定位和布局是通过在子视图上使用android:layout_gravity属性来控制的,这个属性对应于你希望抽屉出现在左边或右边的视图的哪一边。 (或者在支持布局方向的平台版本上开始/结束。)

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

看看这个: 在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; } 

确保并从Activity中调用onOptionsItemSelected(MenuItem item)

 @Override public boolean onOptionsItemSelected(MenuItem item) { if(mDrawerToggle.onOptionsItemSelected(item)) { return true; } return super.onOptionsItemSelected(item); } 

这将允许您使用主页buttonfunction。 要将button移动到操作栏的右侧,您必须实现一个自定义操作项目,也许还有一些其他的东西来让它像你想要的那样工作。

您应该首先将这些代码放在应用程序标记的AppManifest.xml中:

 android:supportsRtl="true" 

然后在你的activity_main.xml文件中,把这段代码:

 android:layout_direction="rtl" 

主要问题有以下错误:

没有抽屉视图发现与绝对重力左

是你定义的

 android:layout_gravity="right" 

列表视图在右边,但是尝试从左边打开抽屉,通过调用这个函数:

 mDrawerToggle.syncState(); 

并点击汉堡图标!

只是评论上面的function,并尝试处理菜单的打开/closures@Rudi说!

我在Android Studio中对导航抽屉活动示例进行了以下修改。 用支持库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(从https://material.io/icons/下载ic_menu_white_24px):;

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

我已经解决了这个问题,通过改变navigationview结束,而不是开始 ,它适用于我

从rtl打开它对于用户体验来说并不好,为了使它响应用户的语言环境,我只是把下面一行添加到我的DrawerLayout参数中:

 android:layoutDirection="locale" 

将它添加到我的AppBarLayout中,使汉堡布局也与抽屉打开方向相匹配。