今天试了试这个抽屉布局的效果,结果很崩溃无语

网上很多资料都千篇一律,感觉都有问题,下面总结下几点经验:

先上个效果图:

1.  layout 布局文件中怎么写:

<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F6F6F6"
>
<!-- 抽屉底部遮罩层 默认不可见 -->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
<!-- 抽屉打开后显示的菜单 默认不可见 -->
<ListView
android:id="@+id/drawerListView"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:background="#FFF"
/>
<!-- 其他页面内容将直接显示 -->
<android.support.v4.view.ViewPager
android:id="@+id/main_view_pager"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
</android.support.v4.view.ViewPager>
</android.support.v4.widget.DrawerLayout>

要兼容低版本的话用  android.support.v4.widget.DrawerLayout

里面固定的结构:

第一个子节点是:FrameLayout  显示为透明黑色遮罩,点击后自动关闭抽屉,不写也能运行,但触屏时会崩溃

第二个子节点是:ListView

这两个默认是不显示的,其他布局视图都会直接显示出来

我一开始看了网上很多例子,但都没有提说到除了抽屉的布局视图之外的视图究竟放哪里,我尝试了很多方法,发现只能将其他布局视图代码放在 DrawerLayout 内部才能正常使用,否则要么是相互覆盖,或者就是触屏事件失效,滚动等效果全部失效。

2. JAVA代码

package com.ai9475.meitian.ui;

import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView; import com.ai9475.meitian.R;
import com.ai9475.util.ZLog;
import com.joanzapata.android.iconify.IconDrawable;
import com.joanzapata.android.iconify.Iconify; /**
* 日记列表
* Created by ZHOUZ on 14-3-10.
*/
public final class MainActivity extends BaseActivity
{
private static final String TAG = "MainActivity"; private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle; @Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
ZLog.i(TAG, "onCreate");
setContentView(R.layout.activity_main); getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true); String[] list = new String[]{"test1", "test2", "test3", "test4", "test5", "test6", "test7", "test8"};
ListView listView = (ListView) findViewById(R.id.drawerListView);
listView.setAdapter(new ArrayAdapter<String>(this, R.layout.list_drawer_item, list)); mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
if (mDrawerLayout == null) {
ZLog.i(TAG, "mDrawerLayout is null");
}
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {
@Override
public void onDrawerClosed(View drawerView) {
ZLog.i(TAG, "onDrawerClosed");
super.onDrawerClosed(drawerView);
getSupportActionBar().setTitle("close drawer");
supportInvalidateOptionsMenu();
} @Override
public void onDrawerOpened(View drawerView) {
ZLog.i(TAG, "onDrawerOpened");
super.onDrawerOpened(drawerView);
getSupportActionBar().setTitle("open drawer");
supportInvalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle); } @Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
} @Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mDrawerToggle.onConfigurationChanged(newConfig);
} @Override
public boolean onCreateOptionsMenu(Menu menu)
{
super.onCreateOptionsMenu(menu);
getMenuInflater().inflate(R.menu.main, menu);
MenuItem home = menu.findItem(R.id.goto_main_activity);
if (home != null) {
home.setIcon(new IconDrawable(this, Iconify.IconValue.fa_home)
.colorRes(R.color.nav_icon)
.actionBarSize());
}
MenuItem my = menu.findItem(R.id.goto_my_activity);
if (my != null) {
my.setIcon(new IconDrawable(this, Iconify.IconValue.fa_user)
.colorRes(R.color.nav_icon)
.actionBarSize());
}
MenuItem tags = menu.findItem(R.id.goto_tags_activity);
if (tags != null) {
tags.setIcon(new IconDrawable(this, Iconify.IconValue.fa_search)
.colorRes(R.color.nav_icon)
.actionBarSize());
}
MenuItem edit = menu.findItem(R.id.goto_edit_activity);
if (edit != null) {
edit.setIcon(new IconDrawable(this, Iconify.IconValue.fa_plus)
.colorRes(R.color.nav_icon)
.actionBarSize());
}
MenuItem more = menu.findItem(R.id.show_more_menu);
if (more != null) {
more.setIcon(new IconDrawable(this, Iconify.IconValue.fa_ellipsis_vertical)
.colorRes(R.color.nav_icon)
.actionBarSize());
}
MenuItem exit = menu.findItem(R.id.goto_exit);
if (exit != null) {
exit.setIcon(new IconDrawable(this, Iconify.IconValue.fa_sign_out)
.colorRes(R.color.nav_icon)
.actionBarSize());
}
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item)
{
if (item != null && item.getItemId() == android.R.id.home) {
if (mDrawerLayout.isDrawerVisible(GravityCompat.START)) {
mDrawerLayout.closeDrawer(GravityCompat.START);
} else {
mDrawerLayout.openDrawer(GravityCompat.START);
}
return true;
}
super.onOptionsItemSelected(item);
int id = item.getItemId();
Intent intent;
switch (id) {
case R.id.goto_my_activity:
if (this.checkLogin(MyActivity.class)) {
intent = new Intent(this, MyActivity.class);
startActivity(intent);
}
break;
}
return true;
}
}

我使用了 actionBar ,网上的很多教程都提到使用 actionBar 的 home 按钮来控制 抽屉的打开和关闭,但却都没有提到如何控制的,甚至官方例子里面也没有看到,我试了半天都没有触发 ActionBarDrawerToggle 里面的时间,后来好不容易找到一篇文章提说到自己实现控制开关抽屉的方法,于是加入该代码在 onOptionsItemSelected 中才终于实现了:

        if (item != null && item.getItemId() == android.R.id.home) {
if (mDrawerLayout.isDrawerVisible(GravityCompat.START)) {
mDrawerLayout.closeDrawer(GravityCompat.START);
} else {
mDrawerLayout.openDrawer(GravityCompat.START);
}
return true;
}

好了几经折腾终于能看到效果了,遮盖正常、VerPager 以及 pager 内部的 fragment中的 listView 的触屏滚动事件均正常

正以为大功告成的时候,又发现个无语的问题,抽屉里面的 ListView 居然不能滚动,卧槽啊。。。谷歌搜索了好半天没找到解决办法,实在顶不住了,放弃吧。。

话说这个抽屉效果太难看了,兼容性也太差了,问题这么多,还是那个 slidingMenu 好些。

还是暂时放弃这个 DrawerLayout 了,浪费生命

Android抽屉效果 DrawerLayout 入门经验总结的更多相关文章

  1. Android 抽屉效果的导航菜单实现

    Android 抽屉效果的导航菜单实现 抽屉效果的导航菜单 看了很多应用,觉得这种侧滑的抽屉效果的菜单很好. 不用切换到另一个页面,也不用去按菜单的硬件按钮,直接在界面上一个按钮点击,菜单就滑出来,而 ...

  2. Android 抽屉效果

    昨天在用“酷我音乐”听歌的时候注意到了界面右上角的四角方块,当我点击这个方块的时候会从屏幕的左边弹出新的界面而把原来的界面挤到左边,是显示了一小部分. 于是,我便在网上查询了一下相关的文章,现将这种效 ...

  3. Android抽屉菜单DrawerLayout的实现案例

    (1)项目布局文件 activity_main.xml <android.support.v4.widget.DrawerLayout xmlns:android="http://sc ...

  4. android抽屉效果

    所谓抽屉  是区别于侧滑菜单 他不会把内容区域挤掉  他只是覆盖在内容区域 下边一个布局文件  一个代码   可以说的就是布局文件就是 <android.support.v4.widget.Dr ...

  5. Android使用ToolBar+DrawerLayout+NavigationView实现侧滑抽屉效果

    学会使用DrawerLayout 学会使用NavigationView 学会使用ToolBar+DrawerLayout+NavigationView实现侧滑抽屉效果 学会实现Toolbar在顶部以及 ...

  6. android组件之DrawerLayout(抽屉导航)-- 侧滑菜单效果

    转载请注明出处:http://blog.csdn.net/crazy1235/article/details/41696291 一. 介绍     导航抽屉显示在屏幕的最左侧,默认情况下是隐藏的,当用 ...

  7. 浅谈DrawerLayout(抽屉效果)

    DrawerLayout是V4包下提供的一种左滑右滑抽屉布局效果. 实现效果如下: 因为是官方提供的,所以使用起来也相对的比较简单. DrawerLayout 提供 1.当界面弹出的时候,主要内容区会 ...

  8. 抽屉效果的实现(DrawerLayout和SlidingMenu的对比)

    在做谷歌电子市场的时候用的是DrawerLayout实现的抽屉效果,在新闻客户端的时候用的是开源框架SlidingMenu来实现的,总的来说,各有个的优点,侧滑(开源框架)实现的效果更好,但是Draw ...

  9. DrawerLayout实现网易新闻抽屉效果

    个人感觉网易的客户端比较前卫,有很多新鲜的东西,有时候模仿这些好的客户端能学到很多东西 开始今天的主要课题,下面是网易客户端抽屉模式实现的效果 其实有个Drawerlayout这个布局,你得问题就已经 ...

随机推荐

  1. C/C++基础知识总结——数据的共享与保护

    1. 标识符的作用域与可见性 1.1 作用域 标识符的作用域包括:函数原型作用域.局部作用域.类作用域.命名空间作用域 (1) 函数原型作用域:函数的参与的作用域就是从函数的开始到结束 (2) 局部作 ...

  2. .NET面向对象特性之封装

    .NET面向对象特性之封装 面向对象的基本内容由:类.对象.属性.方法.字段构成. 面向对象的三大特性:继承.多态.封装. 关于面向对象的特性很多人都把目光转向了继承.多态和接口,却很少有人提及过封装 ...

  3. xcode5向APP store上传应用的时候注意点

    最近我在向appstore 上传应用的时候遇到了各种问题,由于网上的一些教程都是很久以前写的了,现在发布网站有些改动,所以自己走了很多弯路,不多说了,自己记录下犯下的错误吧.我是按照这片博客操作的:点 ...

  4. ASP.NET MVC 之Model的呈现

    ASP.NET MVC 之Model的呈现(仅此一文系列三) 本文目的 我们来看一个小例子,在一个ASP.NET MVC项目中创建一个控制器Home,只有一个Index: public class H ...

  5. 简单的mvc之二:蜿蜒的管线

    关于系列的第二篇,在管线与路由之间犹豫了很久,最终选择了管线—为免于盲人摸象的困惑. 管线的位置在哪里呢?webform,mvc以及web api都架构于asp.net平台上,管线则是asp.net的 ...

  6. Oracle日志文件的管理与查看

    --Oracle日志文件管理与查看 select * from v$sql (#查看最近所作的操作) --select * fromv $sqlarea(#查看最近所作的操作) -- 1.查询系统使用 ...

  7. 构建RESTful风格的WCF服务

    构建RESTful风格的WCF服务 RESTful Wcf是一种基于Http协议的服务架构风格. 相较 WCF.WebService 使用 SOAP.WSDL.WS-* 而言,几乎所有的语言和网络平台 ...

  8. 我的TDD实践---UnitTest单元测试

    我的TDD实践---UnitTest单元测试 “我的TDD实践”系列之UnitTest单元测试 写在前面: 我的TDD实践这几篇文章主要是围绕测试驱动开发所展开的,其中涵盖了一小部分测试理论,更多的则 ...

  9. PHP:获取指定日期所在月的开始日期与结束日期

    /** * 获取指定日期所在月的开始日期与结束日期 * @param string $date * @param boolean 为true返回开始日期,否则返回结束日期 * @return arra ...

  10. 打破惯性思维:聊聊一次debug

    最近公司的新需求中要增加活动营销,整个组的人都被安排去研究某成熟产品的实现.我也认真地在看webService部分的实现,发现了一个诡异的10614端口的请求. 代码如下图: 这是一段服务端发请求验证 ...