我正在使用支持库中的Navigation Drawer模式:http: //developer.android.com/training/implementing-navigation/nav-drawer.html
我试图将其设置为始终在平板电脑上打开(作为侧边菜单)

这是当前实现的可能性,还是我们必须使用Listview创建新的布局和新结构而不是重用相同的代码?
有没有办法确保导航抽屉停留在片段中的内容之上?
我用虚拟数据创建了一个小测试应用程序.10个片段,带有相应的编号按钮和textview.问题在于片段元素似乎比导航抽屉具有更高的优先级.

如截图所示,一旦我尝试打开"0片段",它就会选择在导航抽屉后面的按钮上注册点击.按任何其他内容项工作正常,但只要它们下面没有其他可交互项目.如何让导航抽屉正确地保留在其背后的内容之上,我该怎么办?
因此,当导航抽屉开始打开时,我有要隐藏的标签.我完成打开时隐藏了它们的代码,但这不是我想要的.
mDrawerToggle = new ActionBarDrawerToggle(
this,
mDrawerLayout,
R.drawable.ic_drawer,
R.string.drawer_open,
R.string.drawer_close
) {
@Override
public void onDrawerClosed(View view) {
invalidateOptionsMenu();
setActionBarMode(ActionBar.NAVIGATION_MODE_TABS);
}
@Override
public void onDrawerOpened(View drawerView) {
invalidateOptionsMenu();
setActionBarMode(ActionBar.NAVIGATION_MODE_STANDARD);
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
Run Code Online (Sandbox Code Playgroud)
这是我试过的:
onClickListener为mDrawerLayout.onClick永远不会被召唤onTouchListener为mDrawerLayout.onTouch永远不会被召唤ActionBarDrawerToggle和DrawerLayout课程.找不到类似的东西onDrawerStartedOpening.我正在使用谷歌DrawerLayout.
单击某个项目后,抽屉将平稳关闭并Activity启动.将这些活动转变为Fragments 不是一种选择.因此,启动活动然后关闭抽屉也不是一种选择.关闭抽屉并同时启动活动将使关闭动画口吃.
鉴于我希望首先顺利关闭它,然后启动活动,我遇到了用户点击抽屉项目和他们看到他们想要去的活动之间的延迟问题.
这就是每个项目的点击监听器的样子.
final View.OnClickListener mainItemClickListener = new View.OnClickListener() {
@Override
public void onClick(final View v) {
mViewToLaunch = v;
mDrawerLayout.closeDrawers();
}
};
Run Code Online (Sandbox Code Playgroud)
我的活动也是DrawerListener,它的onDrawerClosed方法如下:
@Override
public synchronized void onDrawerClosed(final View view) {
if (mViewToLaunch != null) {
onDrawerItemSelection(mViewToLaunch);
mViewToLaunch = null;
}
}
Run Code Online (Sandbox Code Playgroud)
onDrawerItemSelection 刚刚启动五项活动之一.
我就没事onPause的DrawerActivity.
我正在检测它,从onClick调用的那一刻开始平均需要500-650ms,直到onDrawerClosed结束.
一旦抽屉关闭,在相应的活动开始之前,存在明显的滞后.
我意识到发生了一些事情:
结束动画发生,就在那里几毫秒(比方说300).
然后,抽屉在视觉上关闭和听众被解雇之间可能存在一些延迟.我试图通过查看DrawerLayout来源确切地弄清楚这有多少发生但尚未弄明白.
然后是启动的活动执行其启动生命周期方法所需的时间,包括onResume.我还没有对此进行检测,但估计大约200-300毫秒.
这似乎是一个问题,走错路是非常昂贵的,所以我想确保我完全理解它.
一个解决方案是跳过关闭动画,但我希望保持它.
如何尽可能减少过渡时间?
嗨,我正在尝试创建类似于gmail app导航抽屉的导航抽屉.我关注开发者网站,但它只指定了基本实现.但我需要根据我的规格自定义导航.
我怎样才能做到这一点?
我一直在尝试通过使用NavigationViewAndroid设计支持库中的新类来简化一些导航抽屉代码.如果您只想要左侧的图标和右侧的文本(例如文档中的示例),那么它的效果很好,但是如果我想android.support.v7.widget.SwitchCompat在Google Play电影应用中添加一个自定义视图,那该怎么办?看下面的截图)?

我已尝试使用该actionLayout属性指定自定义布局文件,如下面的示例代码中所示,但该属性似乎被忽略,因为它不起作用.
res/menu/navigation_drawer.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:id="@+id/group1"
android:checkableBehavior="single">
<item
android:id="@+id/nav_screen1"
android:icon="@drawable/ic_list_black_24dp"
android:title="Screen 1" />
<item
android:id="@+id/nav_screen2"
android:icon="@drawable/ic_search_black_24dp"
android:title="Screen2"/>
</group>
<group android:id="@+id/group2">
<item
android:id="@+id/nav_custom"
android:icon="@drawable/custom_icon_24dp"
app:actionLayout="@layout/nav_drawer_switch"
android:title="Custom item with switch"/>
<item
android:id="@+id/nav_settings"
android:icon="@drawable/ic_settings_black_24dp"
android:title="Settings"/>
</group>
</menu>
Run Code Online (Sandbox Code Playgroud)
res/layout/nav_drawer_switch.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.SwitchCompat
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:text="Custom item with switch"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我怎样才能让它发挥作用?理想情况下,我想在仍然使用我的菜单布局的同时添加自定义视图,但如果不使用粗糙的黑客(如利用支持库生成的现有布局)那是不可能的,那么我想知道代码最少的解决方案,仍然值得转换NavigationView.
我的应用程序的主要活动有一个导航抽屉,以这种方式在XML中实例化:
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/drawer_header"
app:menu="@menu/application_drawer"
android:background="@color/white"/>
Run Code Online (Sandbox Code Playgroud)
现在,导航抽屉的菜单项如下:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single">
<item
android:id="@+id/login"
android:icon="@drawable/ic_action_person"
android:title="@string/login"/>
<item
android:id="@+id/settings"
android:icon="@drawable/ic_action_settings"
android:title="@string/settings"/>
<item
android:id="@+id/terms"
android:icon="@drawable/ic_action_about"
android:title="@string/terms_and_conditions_menu"/>
<item
android:id="@+id/about"
android:icon="@drawable/ic_action_about"
android:title="@string/info_hotelsclick"/>
</group>
Run Code Online (Sandbox Code Playgroud)
我想做的是在某些条件下动态更改第一项(也可能是其他项).例如,我想在用户登录后用"注销"更改"登录"条目;-)
我怎样才能做到这一点?我设法以这种方式将一个项目添加到抽屉
Menu menu = navigationView.getMenu();
menu.add("Test");
Run Code Online (Sandbox Code Playgroud)
但这听起来对我不好,我很确定必须有一个更清洁的方式.
......但是呢?
我正在开发的应用程序包含一个在Activity中实现的导航抽屉.活动布局如下:
<FrameLayout 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:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.CoordinatorLayout
android:id="@+id/coordinator"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<include
android:id="@+id/appbar"
layout="@layout/appbar" />
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView
android:id="@+id/navigation_drawer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
app:headerLayout="@layout/header_drawer"
app:menu="@menu/menu_nav">
</android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
这是一种非常常见的模式,只有经常更改的是容器布局中的Fragment.
如果任何片段具有滚动元素,则在滚动时,CoordinatorLayout将很乐意进行位置转换,包括工具栏/ AppBarLayout.
这里真正的问题是,当Fragment被替换时,工具栏的位置保持不变,即,如果隐藏工具栏,它将保持不变.
结果如下:
这个:

卡住:

如何在这种情况下重置工具栏位置?
编辑: 可能是一个错误,只有在重新启动应用程序时才会调用AppBarLayout偏移更改侦听器(按下后退按钮并打开应用程序),并在激烈的投掷后停止再次调用.
android navigation-drawer android-design-library androiddesignsupport
我有一个导航抽屉.当一个事件被调用时,我想为用户隐藏我的一个导航菜单项.我怎样才能做到这一点?
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sliding_menu);
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
mTitle = mDrawerTitle = getTitle();
// load slide menu items
navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
// nav drawer icons from resources
navMenuIcons = getResources()
.obtainTypedArray(R.array.nav_drawer_icons);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout1);
mDrawerList = (ListView) findViewById(R.id.list_slidermenu1);
navDrawerItems = new ArrayList<NavDrawerItem>();
// adding nav drawer items to array
// Home
navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
// Profil
navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
// Prospek
navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1))); …Run Code Online (Sandbox Code Playgroud) Android Studio中新的默认导航抽屉活动模板
在菜单文件中定义其标题和图标,activity_main_drawer如下所示:
<group android:checkableBehavior="single">
<item
android:id="@+id/nav_camara"
android:icon="@drawable/ic_action_emo_cool"
android:title="Import" />
<item
android:id="@+id/nav_gallery"
android:icon="@android:drawable/ic_menu_gallery"
android:title="Gallery" />
<item
android:id="@+id/nav_slideshow"
android:icon="@android:drawable/ic_menu_slideshow"
android:title="Slideshow" />
...
Run Code Online (Sandbox Code Playgroud)
我的示例中的第一项使用了一个红色图标:
但是当我运行应用程序时,图标的颜色仍然是黑色.我已经测试了这个蓝色,绿色,黄色和紫色图标,但结果是一样的.
我读到工具栏应该使用的地方,ThemeOverlay.AppCompat.Dark.ActionBar我的应用程序已在styles.xml文件中使用它:
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
Run Code Online (Sandbox Code Playgroud)
最初我认为这与Android Studio的缓存功能有关,所以我使缓存失效并重新启动Android Studio而没有运气.