我有一个没有任何操作栏的导航栏(我不想要一个操作栏).我正在尝试这样做,以便我有一个可以打开导航抽屉的按钮.
我知道有对DrawerLayout一个名为openDrawer方法 http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html#openDrawer(android.view.View)
我不知道如何使用它,但我在点击时尝试制作一个按钮,运行此方法:
DrawerLayout mDrawerLayout = (DrawerLayout) getView().findViewById(R.id.drawer_layout);
mDrawerLayout.openDrawer(mDrawerLayout);
Run Code Online (Sandbox Code Playgroud)
当我点击它时,它给了我一个Java NullPointerException.有人有什么想法吗?
编辑:此代码在片段内,我试图在片段外引用这些抽屉布局.我使用了调试器,它显示mDrawlerLayout为NULL.
有什么建议?
谢谢!
我想有例如LinearLayout或者RelativeLayout从屏幕的,而不是一个孤独的左侧滑动ListView.
我试图将使用LinearLayout与android:layout_gravity="start"和我在运行时有此错误:
ClassCastException: android.widget.LinearLayout$LayoutParams cannot
be cast to android.support.v4.widget.DrawerLayout$LayoutParams
Run Code Online (Sandbox Code Playgroud)
这是布局文件:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white"
>
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:layout_width="320dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:orientation="vertical">
<ImageView
android:id="@+id/ivwLogo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/video_icon"
/>
<ListView
android:id="@+id/left_drawer"
android:layout_width="320dp"
android:layout_height="match_parent"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="@android:color/white"
/>
</LinearLayout>
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)
谢谢
我想创建一个全宽导航抽屉.设置layout_width为match_parenton @+id/left_drawer的宽度约为屏幕空间的80%.这似乎是标准行为.我一定要重写onMeasure()的DrawerLayout?
我目前的代码:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/black"
android:id="@+id/mainFragmentContainer">
</FrameLayout>
<include
android:id="@+id/left_drawer"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
layout="@layout/drawer"/>
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)
谢谢.
我使用android.support.v7.widget.Toolbar与android.support.v4.widget.DrawerLayout.它工作正常,导航抽屉关闭时显示汉堡图标,抽屉打开时显示箭头图标.我想在应用程序中的某些事件中禁用抽屉并将Burger图标设置为箭头.我试图将锁定模式设置为关闭,但v7.app.ActionBarDrawerToggle仍显示Burger并打开抽屉.
mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
有任何想法吗?谢谢!
更新:
不,我可以更改图标的状态,我可以启用/禁用抽屉,但动画不能使用此方法:
@Override
protected void onCreate(Bundle savedInstanceState) {
...
Toolbar toolbar = (Toolbar) findViewById(R.id.application_toolbar);
setSupportActionBar(toolbar);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.string1, R.string.string2) {
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
}
};
//mDrawerLayout.setDrawerListener(mDrawerToggle); // not needed
...
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
if (mDrawerLayout.getDrawerLockMode(GravityCompat.START) == LOCK_MODE_UNLOCKED) {
showDrawer();
} else {
handleBackButtonPress(); // On this stage the home button is …Run Code Online (Sandbox Code Playgroud) 我已成功为我的应用程序实现了NavigationDrawer.
我的应用程序显示在屏幕左侧打开的抽屉.
我的问题是我需要在左边添加一个按钮.可以单击或滑动该按钮以打开左侧抽屉.我能做到的.
但按钮应该看起来像抽屉的一部分会溢出到屏幕上.
这意味着当抽屉打开和关闭时,按钮应同时滑动.
关闭状态:

开放状态

我尝试将按钮添加到左侧抽屉的布局中,但似乎您无法使其显示在其边界之外,并且当您关闭它时,抽屉将始终完全隐藏.
现在我正在尝试添加它以向主DrawerLayout添加一个按钮并使其与左抽屉的右侧对齐...但没有运气......看起来像DrawerLayout不能有两个以上的孩子.. .
任何帮助将不胜感激.
我正在使用支持库(v4)
[编辑]我支持API级别8 ...所以不能使用ImageView.setTranslationX或View.OnAttachStateChangeListener
在Android的文字游戏中,我目前有一个硬编码的菜单left_drawer_menu.xml,由3组(轮到我,回合对手,最后是其他东西)组成.
mLeftDrawer = (NavigationView) findViewById(R.id.left_drawer);
mLeftDrawer.setNavigationItemSelectedListener(
new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(final MenuItem menuItem) {
Menu menu = mLeftDrawer.getMenu();
if (menuItem.getGroupId() == R.id.my_move) {
menu.setGroupCheckable(R.id.my_move, true, true);
menu.setGroupCheckable(R.id.his_move, false, false);
menu.setGroupCheckable(R.id.extras, false, false);
} else if (menuItem.getGroupId() == R.id.his_move) {
menu.setGroupCheckable(R.id.my_move, false, false);
menu.setGroupCheckable(R.id.his_move, true, true);
menu.setGroupCheckable(R.id.extras, false, false);
} else if (menuItem.getGroupId() == R.id.extras) {
menu.setGroupCheckable(R.id.my_move, false, false);
menu.setGroupCheckable(R.id.his_move, false, false);
menu.setGroupCheckable(R.id.extras, true, true);
}
menuItem.setChecked(true);
mLeftItem = menuItem.getItemId();
mDrawerLayout.closeDrawer(mLeftDrawer);
mHandler.postDelayed(new Runnable() {
@Override
public void …Run Code Online (Sandbox Code Playgroud) 我使用Android Design Support Library在DrawerLayout中创建了一个NavigationView
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<!-- other views -->
<android.support.design.widget.NavigationView
android:id="@+id/navigation"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:menu="@menu/my_navigation_items" />
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)
my_navigation_items.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/bookmarks_drawer"
android:icon="@drawable/ic_drawer_bookmarks"
android:title="@string/bookmarks" />
<item
android:id="@+id/alerts_drawer"
android:icon="@drawable/ic_drawer_alerts"
android:title="@string/alerts" />
<item
android:id="@+id/settings_drawer"
android:icon="@drawable/ic_drawer_settings"
android:title="@string/settings" />
</group>
</menu>
Run Code Online (Sandbox Code Playgroud)
现在,我想为NavigationView下面的图像中的每个项目设置未读通知计数器:
如何在项目上设置未读通知计数器NavigationView?
android android-support-library drawerlayout android-design-library navigationview
我有活动,附有抽屉.抽屉的每个菜单都是一个片段,在其中一个菜单下我有一个片段TabLayout,每个标签包含一个RecyclerView.所以现在,当我滚动时RecyclerView,标签布局被隐藏但ToolBar仍然位于顶部.我需要的是ToolBar隐藏(scrollFlags:scroll|enterAlways),并TabLayout应显示在顶部.
所以目前的设置是:
Activity with attached DrawerLayout
-> Fragment with TabLayout
-> Tab Fragment 1 with RecyclerView
-> Tab Fragment 2 with RecyclerView
android android-fragments drawerlayout material-design android-toolbar
我一直在试图跨越到移动我的代码DrawerLayout作为由Android建议这里是SlidingDrawer已经过时了.
我的问题是,到目前为止DrawerLayout似乎要么执行得非常糟糕,有无用的错误消息(没有防御性编程)和/或在文档中没有得到足够的解释.
这个isDrawerOpen()方法在这里描述:
public boolean isDrawerOpen(查看抽屉)
检查给定的抽屉视图当前是否处于打开状态.为了被视为"开放",抽屉必须已经稳定在其完全可见的状态.要检查部分可见性,请使用isDrawerVisible(android.view.View).
参数:drawer - 要检查的抽屉视图
返回:如果给定的抽屉视图处于打开状态,则返回true
每个方法isDrawerOpen(View drawer),openDrawer(View drawer)并且closeDrawer(View drawer)在传递时不起作用:DrawerLayout有问题或者其中任何一个的孩子.我不知道我应该为这些方法提供什么来让它们发挥作用.有人能告诉我吗?
有关实现,请参阅下面的整个问题描述.
我有这样的布局:
<android.support.v4.widget.DrawerLayout
android:id="@+id/mainmenuPanel"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<FrameLayout
android:id="@+id/dualPane"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/menuPane"
android:layout_width="300dp"
android:layout_height="match_parent" />
</android.support.v4.widget.DrawerLayout>
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我将以下方法连接到一个按钮:
protected void onCreate(Bundle savedInstanceState) {
...
mMenuPanel = (DrawerLayout) findViewById(R.id.mainmenuPanel);
....
}
public boolean isDrawerOpen() {
if(mMenuPanel != null) {
return mMenuPanel.isDrawerOpen(mMenuPanel);
}
return false;
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建和改进现有的SlidingDrawers项目,这些项目可以适用于屏幕的所有四个边{LEFT,RIGHT,TOP,BOTTOM}.有一些库,但它们都有局限性,复杂性和错误.其中一个比较常见的是umano的AndroidSlidingUpPanel,但是,我不喜欢这个库,因为你只需要包含两个子布局,并且还需要注意主要内容的具体安排.其他库类似,或更复杂,或有bug.
我接近完成我的SlidingDrawers版本,我专注于BOTTOM引力.我需要一些帮助.单击抽屉将打开并关闭它.您也可以用手指滑动抽屉.但是,如果你扔掉抽屉,整个视图将会移动到比它应该更低或更低的位置.
我该如何解决这个问题?据我所知,我的数学是正确的.我传给动画师的翻译价值应该是正确的.以下是我完成的工作.请查看此项目https://github.com/drxeno02/CustomDrawerLayout.git.先感谢您.
对于那些想要查看有问题的代码看起来的片段的人来说,这就是我目前正在做的手势.
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mActivePointerId = MotionEventCompat.getPointerId(event, 0);
switch (mStickTo) {
case GRAVITY_BOTTOM:
case GRAVITY_TOP:
mInitialCoordinate = event.getY();
break;
case GRAVITY_LEFT:
case GRAVITY_RIGHT:
mInitialCoordinate = event.getX();
break;
}
break;
case MotionEvent.ACTION_MOVE:
float coordinate = 0;
switch (mStickTo) {
case GRAVITY_BOTTOM:
case GRAVITY_TOP:
coordinate = event.getY();
break;
case GRAVITY_LEFT:
case GRAVITY_RIGHT:
coordinate = event.getX();
break;
}
final int diff = (int) Math.abs(coordinate - mInitialCoordinate);
// confirm that difference …Run Code Online (Sandbox Code Playgroud)