Android抽屉效果 DrawerLayout 入门经验总结
今天试了试这个抽屉布局的效果,结果很崩溃无语
网上很多资料都千篇一律,感觉都有问题,下面总结下几点经验:
先上个效果图:
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 入门经验总结的更多相关文章
- Android 抽屉效果的导航菜单实现
Android 抽屉效果的导航菜单实现 抽屉效果的导航菜单 看了很多应用,觉得这种侧滑的抽屉效果的菜单很好. 不用切换到另一个页面,也不用去按菜单的硬件按钮,直接在界面上一个按钮点击,菜单就滑出来,而 ...
- Android 抽屉效果
昨天在用“酷我音乐”听歌的时候注意到了界面右上角的四角方块,当我点击这个方块的时候会从屏幕的左边弹出新的界面而把原来的界面挤到左边,是显示了一小部分. 于是,我便在网上查询了一下相关的文章,现将这种效 ...
- Android抽屉菜单DrawerLayout的实现案例
(1)项目布局文件 activity_main.xml <android.support.v4.widget.DrawerLayout xmlns:android="http://sc ...
- android抽屉效果
所谓抽屉 是区别于侧滑菜单 他不会把内容区域挤掉 他只是覆盖在内容区域 下边一个布局文件 一个代码 可以说的就是布局文件就是 <android.support.v4.widget.Dr ...
- Android使用ToolBar+DrawerLayout+NavigationView实现侧滑抽屉效果
学会使用DrawerLayout 学会使用NavigationView 学会使用ToolBar+DrawerLayout+NavigationView实现侧滑抽屉效果 学会实现Toolbar在顶部以及 ...
- android组件之DrawerLayout(抽屉导航)-- 侧滑菜单效果
转载请注明出处:http://blog.csdn.net/crazy1235/article/details/41696291 一. 介绍 导航抽屉显示在屏幕的最左侧,默认情况下是隐藏的,当用 ...
- 浅谈DrawerLayout(抽屉效果)
DrawerLayout是V4包下提供的一种左滑右滑抽屉布局效果. 实现效果如下: 因为是官方提供的,所以使用起来也相对的比较简单. DrawerLayout 提供 1.当界面弹出的时候,主要内容区会 ...
- 抽屉效果的实现(DrawerLayout和SlidingMenu的对比)
在做谷歌电子市场的时候用的是DrawerLayout实现的抽屉效果,在新闻客户端的时候用的是开源框架SlidingMenu来实现的,总的来说,各有个的优点,侧滑(开源框架)实现的效果更好,但是Draw ...
- DrawerLayout实现网易新闻抽屉效果
个人感觉网易的客户端比较前卫,有很多新鲜的东西,有时候模仿这些好的客户端能学到很多东西 开始今天的主要课题,下面是网易客户端抽屉模式实现的效果 其实有个Drawerlayout这个布局,你得问题就已经 ...
随机推荐
- Vijos1055 奶牛浴场(极大化思想求最大子矩形)
思路详见 王知昆<浅谈用极大化思想解决最大子矩形问题> 写得很详细(感谢~....) 因为不太会用递推,所以用了第一种方法,时间复杂度是O(n^2),n为枚举的点数,对付这题绰绰有余 思路 ...
- [google面试CTCI] 2-1.移除链表中重复元素
[链表] Q:Write code to remove duplicates from an unsorted linked list FOLLOW UP How would yo ...
- VS2010下C/C++连接MySql数据库的方法
1. 新建一个C++控制台程序 2. 选择项目 CMySql属性 3. 选择配置属性 C/C++ 常规 附加包含目录 4. 添加包含目录C:\Program Files\MySQL\Connector ...
- Github官方app分析——用户身份验证模块
这篇文章记述的是我对Giuhub官方app的用户身份验证模块的分析. Giuhub的官方app虽然是一个非常小众的程序,但是从程序的设计的角度看,这是一个非常优秀的项目.对于其用户身份验证模块,给我留 ...
- Atomic变量和Thread局部变量
Atomic变量和Thread局部变量 前面我们已经讲过如何让对象具有Thread安全性,让它们能够在同一时间在两个或以上的Thread中使用.Thread的安全性在多线程设计中非常重要,因为race ...
- 对无返回值、使用Action或Func作为参数、多重载的方法进行单元测试
VS2012 Unit Test(Void, Action, Func) —— 对无返回值.使用Action或Func作为参数.多重载的方法进行单元测试 [提示] 1. 阅读文本前希望您具备如下知识: ...
- Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径
Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径 我们要实现 通过路由 匹配出 博客地址 和博客文章地址 例如下面的这两个地址 //http://www.cnblogs.com/ma ...
- 浅谈一下SSI+Oracle框架的整合搭建
浅谈一下SSI+Oracle框架的整合搭建 最近换了一家公司,公司几乎所有的项目都采用的是Struts2+Spring+Ibatis+Oracle的架构,上一个东家一般用的就是JSF+Spring,所 ...
- MongoDB安装心得
本人纯前端一枚,对于数据库安装各种纠结,出了不少错误,一一列出,方便遇到同样问题的人给以参考,也加深一下自己印象. 故事开始了...Node.js在前端界比较火,由于我也是小小前端,跟随大潮流开始步入 ...
- 《Head First Python》学习笔记03 异常处理
异常(运行时错误): 当代码逻辑遇到意外事件时,比如打开一个文件,却发现文件不存在.这时是增加额外的代码处理逻辑,还是捕获异常呢?答案是:Python优先推荐捕获异常,然后恢复. Python异常机制 ...