Android - 可以从右侧导航抽屉吗?
Posted
技术标签:
【中文标题】Android - 可以从右侧导航抽屉吗?【英文标题】:Android - Is Navigation Drawer from right hand side possible? 【发布时间】:2013-06-13 22:15:42 【问题描述】:http://developer.android.com/training/implementing-navigation/nav-drawer.html
根据这个文档,它没有说是否可以从右侧实现抽屉。甚至可能吗? :(
【问题讨论】:
检查这个答案:***.com/a/17792254/1572408 它对我有用。 【参考方案1】:NavigationDrawer 可以配置为从左侧、右侧或两者拉出。关键是抽屉在 XML 声明中的出现顺序,以及 layout_gravity 属性。这是一个例子:
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_
android:layout_ >
<FrameLayout
android:id="@+id/content"
android:layout_
android:layout_
android:baselineAligned="false" >
</FrameLayout>
<!-- Left drawer -->
<ListView
android:id="@+id/left_drawer"
android:layout_
android:layout_
android:layout_gravity="left"
android:choiceMode="singleChoice" />
<!-- Right drawer -->
<ListView
android:id="@+id/right_drawer"
android:layout_
android:layout_
android:layout_gravity="right"
android:choiceMode="singleChoice" />
</android.support.v4.widget.DrawerLayout>
【讨论】:
【参考方案2】:这是抽屉上的文档,您可以将其配置为从左侧或右侧拉出。
抽屉的定位和布局由 子视图上的 android:layout_gravity 属性对应于哪个 您希望抽屉出现的视图的一侧:左侧或右侧。 (或在支持布局方向的平台版本上开始/结束。)
http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html
【讨论】:
为什么他们的例子在我的情况下不起作用?我的意思是,我将它设置为希伯来语,但看不到它在右侧。 我将需要更多继续。你确定一切都配置正确吗?我建议发布一个新问题。 我决定放手。我设法通过使用其他东西使他们的项目工作,然后我决定不使用它,因为将导航抽屉放在另一边可能会造成混淆。也许我以后会改变主意。 @LarryMcKenzie - 可以在右侧设置可绘制菜单吗? @RoCk 我假设您正在谈论看起来像 3 条水平线的汉堡菜单图标。它不是 DrawerLayout 的组件。因此,您可以在任何可以打开导航抽屉的地方创建一个按钮。这不是推荐的模式,但您可以将图标放在菜单中,将其放置在工具栏的右侧。【参考方案3】:我的应用程序因“没有发现重力向左的抽屉视图”错误而崩溃。
所以将这个添加到 onOptionsItemSelected 中:
if (item != null && item.getItemId() == android.R.id.home)
if (mDrawerLayout.isDrawerOpen(Gravity.RIGHT))
mDrawerLayout.closeDrawer(Gravity.RIGHT);
else
mDrawerLayout.openDrawer(Gravity.RIGHT);
【讨论】:
【参考方案4】:添加到https://***.com/a/21781710/437039 解决方案。
如果您使用的是由 Android Studio 创建的 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 个方法:
方法一
public boolean isDrawerOpen(int gravity)
return mDrawerLayout != null && mDrawerLayout.isDrawerOpen(gravity);
方法二
public void closeDrawer(int gravity)
mDrawerLayout.closeDrawer(gravity);
方法三
public void openDrawer(int gravity)
mDrawerLayout.openDrawer(gravity);
只有现在,右侧的抽屉才会起作用。
【讨论】:
【参考方案5】:您可以使用 Material design 中的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_
android:layout_
android:fitsSystemWindows="true"
tools:openDrawer="start">
<include
layout="@layout/app_bar_main"
android:layout_
android:layout_ />
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_
android:layout_
android:layout_gravity="end"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:menu="@menu/activity_main_drawer" />
</android.support.v4.widget.DrawerLayout>
【讨论】:
【参考方案6】:我知道这是一个老问题,但对于那些仍在寻找答案的人来说:
是的,这是可能的。请在下面的链接中查看我的答案:
https://***.com/a/19358114/1572408
【讨论】:
【参考方案7】:然后使用这些代码@amal 我认为这会对您有所帮助。 XML:
<!-- Framelayout to display Fragments -->
<FrameLayout
android:id="@+id/frame_container"
android:layout_
android:layout_ >
<RelativeLayout
android:layout_
android:layout_
android:background="@drawable/counter_bg" >
<ImageView
android:id="@+id/iconl"
android:layout_
android:layout_
android:layout_gravity="left"
android:layout_marginLeft="12dp"
android:layout_marginRight="12dp"
android:src="@drawable/ic_launcher" />
<ImageView
android:id="@+id/iconr"
android:layout_
android:layout_
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_
android:layout_
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_
android:layout_
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");
【讨论】:
【参考方案8】:要从屏幕右侧设置导航抽屉,请将抽屉布局设置为导航视图的父级,并将导航视图的布局重力设置为右侧。
【讨论】:
【参考方案9】:将此代码写入您的 Main.java 中,im1 是 xml 文件右上角的导航栏图标。
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
im1=findViewById(R.id.humburgericon);
im1.setOnClickListener(new View.OnClickListener()
@SuppressLint("WrongConstant")
@Override
public void onClick(View v)
drawerLayout.openDrawer(Gravity.END););
【讨论】:
以上是关于Android - 可以从右侧导航抽屉吗?的主要内容,如果未能解决你的问题,请参考以下文章