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

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

先上个效果图:

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. How to upload a file in MVC4

    Uploading a file in Asp.Net MVC application is very easy. The posted file is automatically available ...

  2. 基本功能的shell

    手把手教你编写一个具有基本功能的shell(已开源) 刚接触Linux时,对shell总有种神秘感:在对shell的工作原理有所了解之后,便尝试着动手写一个shell.下面是一个从最简单的情况开始,一 ...

  3. 学习Linux(一)环境搭建

    零基础学习Linux(一)环境搭建 从本文开始我会为大家介绍一下linux环境下详细的集群环境安装.配置.部署到实例演示的整个过程.在此过程中会给大家详细介绍一下Linux的操作技巧和一些工具的使用. ...

  4. 查看Tomcat版本

    在Tomcat的安装目录的bin目录下,有这么两个文件 version.bat    windows下的批处理文件 version.sh      Linux下的Shell脚本 在DOS窗口执行ver ...

  5. ${pageContext.request.contextPath}的作用

    刚开始不知道是怎么回事,在网上也查找了一些资料,看了还是晕. 看了另一个大侠的,终于有了点眉目. 那位大侠在博客中这样写道“然后在网上找,更让我郁闷的事,TMD!网上“抄袭”的真多啊!而且扯了一大堆! ...

  6. Hibernate配置XML连接数据库

    一.hibernate.cfg.xml 1.配置连接Oracle <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate ...

  7. ios学习笔记(二)之Objective-C类、继承、类别和协议

    二:Objective-C类与继承和协议 在前面已经提过了对象的初始化,这里首先讲的是变量. 2.1 变量 局部变量(内部变量): 局部变量是在方法内作定义说明的,其作用域仅限于方法内,离开方法后使用 ...

  8. 绘制基本图形和线型(StrokeStyle)的设置详解

    绘制基本图形和线型(StrokeStyle)的设置详解 目前,在博客园上,相对写得比较好的两个关于Direct2D的教程系列,分别是万一的Direct2D系列和zdd的Direct2D系列.有兴趣的网 ...

  9. ASP.NET Web API的消息处理管道: HttpRoutingDispatcher

    ASP.NET Web API的消息处理管道: HttpRoutingDispatcher 认情况下,作为消息处理管道“龙头”的HttpServer的Dispatcher属性返回一个HttpRouti ...

  10. 对C# 构造函数的理解

    C#构造函数是在创建给定类型的对象时执行的类方法. 构造函数具有与类相同的名称,它通常初始化新对象的数据成员.不带参数的构造函数称为“默认构造函数”. 无论何时,只要使用 new 运算符实例化对象,并 ...