概述
本篇博客是对developer.android.com/上的Training课程的简单翻译,若是觉得翻译出来的理解有困难,请点击下方链接查看原文!
关于DrawerLayout的Training:http://developer.android.com/training/implementing-navigation/nav-drawer.html
关于DrawerLayout的API:http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html

创建抽屉布局
创建一个抽屉布局必须得以DrawerLayout作为XML文件的根节点,记住,DrawerLayout引用的是Android.support.v4.DrawerLayout,然后在布局内部添加内容视图区域和一个或者两个抽屉视图区域,这里理解抽屉视图即为上面描述的菜单视图。例如下面一段布局中显示,在布局中添加一个FrameLayout作为内容区域(通常用来呈现Fragment),另外在下面定义了一个listView用来呈现抽屉菜单视图:
<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">
<!-- The main content view -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- The navigation drawer -->
<ListView android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#111"/>
</android.support.v4.widget.DrawerLayout>
这个布局文件示范了一些重要的布局特征.
初始化抽屉列表
在你的Activity中, 第一件事就是初始化导航抽屉列表里面的元素, 你如何做取决于你的应用程序的内容,但一个导航抽屉通常包括一个ListView, 因此清单应该由一个Adapter填充(例如ArrayAdapter或SimpleCursorAdapter).
例如, 这里演示了如何用String array来初始化一个导航列表.
public class MainActivity extends Activity {
private String[] mPlanetTitles;
private DrawerLayout mDrawerLayout;
private ListView mDrawerList;
...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPlanetTitles = getResources().getStringArray(R.array.planets_array);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
// Set the adapter for the list view
mDrawerList.setAdapter(new ArrayAdapter<String>(this,
R.layout.drawer_list_item, mPlanetTitles));
// Set the list's click listener
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
...
}
}
这个代码调用setOnItemClickListener()去接收导航抽屉列表的点击事件. 下一节将展示如何实现这个接口,当用户选择一个Item时改变内容视图.
处理导航点击事件
当用户选择了抽屉列表里面的一个Item时, 系统调用onItemClickListener上的onItemClick(), 给setOnItemClickListener().
你在onItemClick()方法里面做什么, 取决于你的app实现的结构. 在下面的例子中, 选择每一个Item都会在主要内容的布局中插入一个不同的Fragment.
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView parent, View view, int position, long id) {
selectItem(position);
}
}
/** Swaps fragments in the main content view */
private void selectItem(int position) {
// Create a new fragment and specify the planet to show based on position
Fragment fragment = new PlanetFragment();
Bundle args = new Bundle();
args.putInt(PlanetFragment.ARG_PLANET_NUMBER, position);
fragment.setArguments(args);
// Insert the fragment by replacing any existing fragment
FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment)
.commit();
// Highlight the selected item, update the title, and close the drawer
mDrawerList.setItemChecked(position, true);
setTitle(mPlanetTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}
@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}
监听打开和关闭事件
侦听抽屉打开和关闭事件,调用你的DrawerLayout setDrawerListener(), 并将其传递给DrawerLayout.DrawerListener的实现. 这个接口提供了回调抽屉事件, 如onDrawerOpened()和onDrawerClosed ()。
然而, 相对于实现DrawerLayout.DrawerListener, 如果你的Activity包括工具栏, 可以代替继承ActionBarDrawerToggle类. ActionBarDrawerToggle实现了DrawerLayout.DrawerListener. 所以你仍然可以覆盖这些回调, 但它也有助于正确的交互行为, 在工具栏的图标和导航抽屉之间(下一节将进一步讨论)。
就像在导航抽屉设计指南一样,当抽屉是可见的时候, 你应该修改工具栏的内容, 如改变标题和删除操作Item. 下面的代码用ActionBarDrawerToggle类的一个实例, 显示了如何重写DrawerLayout.DrawerListener的回调方法:
public class MainActivity extends Activity {
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
private CharSequence mDrawerTitle;
private CharSequence mTitle;
...
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
mTitle = mDrawerTitle = getTitle();
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_close) {
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
getActionBar().setTitle(mTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
getActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};
// Set the drawer toggle as the DrawerListener
mDrawerLayout.setDrawerListener(mDrawerToggle);
}
/* Called whenever we call invalidateOptionsMenu() */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// If the nav drawer is open, hide action items related to the content view
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
}
下一节描述ActionBarDrawerToggle构造函数参数和其他所需的步骤来设置它来处理工具栏的图标.
打开关闭应用图标
用户可以打开和关闭导航抽屉, 通过手指从屏幕左侧的边缘滑动, 但如果你使用工具栏, 你应该也能允许用户打开和关闭它, 通过触摸应用程序图标. 应用程序图标也可以显示一个特殊的图标关于导航抽屉的状态. 你可以实现所有这些行为通过使用ActionBarDrawerToggle, 如前一节所示。
让ActionBarDrawerToggle工作, 创建一个它的实例用它的构造方法, 这就需要以下参数:
然后, 无论你是否已经创建了一个ActionBarDrawerToggle的子类作为你的抽屉的Listener, 你需要在几个Activity生命周期的地方, 调用你的ActionBarDrawerToggle:
public class MainActivity extends Activity {
private DrawerLayout mDrawerLayout;
private ActionBarDrawerToggle mDrawerToggle;
...
public void onCreate(Bundle savedInstanceState) {
...
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerToggle = new ActionBarDrawerToggle(
this, /* host Activity */
mDrawerLayout, /* DrawerLayout object */
R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */
R.string.drawer_open, /* "open drawer" description */
R.string.drawer_close /* "close drawer" description */
) {
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
getActionBar().setTitle(mTitle);
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
getActionBar().setTitle(mDrawerTitle);
}
};
// Set the drawer toggle as the DrawerListener
mDrawerLayout.setDrawerListener(mDrawerToggle);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
}
@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 onOptionsItemSelected(MenuItem item) {
// Pass the event to ActionBarDrawerToggle, if it returns
// true, then it has handled the app icon touch event
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
// Handle your other action bar items...
return super.onOptionsItemSelected(item);
}
...
}
官方Demo:http://xiazai./201701/yuanma/NavigationDrawer().rar
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android
# DrawerLayout
# 导航
# Android之侧滑菜单DrawerLayout的使用介绍
# Android组件DrawerLayout仿网易新闻v4.4侧滑菜单
# Android DrawerLayout实现抽屉效果实例代码
# Android Drawerlayout侧拉栏事件传递问题的解决方法
# Android实现右边抽屉Drawerlayout效果
# Android DrawerLayout带有侧滑功能的布局类(2)
# Android DrawerLayout带有侧滑功能的布局类(1)
# Android App中DrawerLayout抽屉效果的菜单编写实例
# Android组件之DrawerLayout实现抽屉菜单
# Android开发之DrawerLayout实现抽屉效果
# 主要内容
# 回调
# 应用程序
# 你应该
# 创建一个
# 抽屉里
# 的是
# 几个
# 如果你
# 是在
# 就像
# 你可以
# 子类
# 请点击
# 出现在
# 你在
# 也能
# 做什么
# 会在
# 所需
相关文章:
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
东莞专业制作网站的公司,东莞大学生网的网址是什么?
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
建站之星收费标准详解:套餐费用及年费价格表一览
再谈Python中的字符串与字符编码(推荐)
想学网站制作怎么学,建立一个网站要花费多少?
香港服务器网站卡顿?如何解决网络延迟与负载问题?
公司网站设计制作厂家,怎么创建自己的一个网站?
上海网站制作开发公司,上海买房比较好的网站有哪些?
如何在橙子建站中快速调整背景颜色?
如何构建满足综合性能需求的优质建站方案?
如何选择服务器才能高效搭建专属网站?
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?
如何自定义建站之星网站的导航菜单样式?
如何选择高效可靠的多用户建站源码资源?
已有域名和空间,如何快速搭建网站?
如何在企业微信快速生成手机电脑官网?
网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?
网站制作需要会哪些技术,建立一个网站要花费多少?
如何批量查询域名的建站时间记录?
如何获取上海专业网站定制建站电话?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
行程制作网站有哪些,第三方机票电子行程单怎么开?
建站主机系统SEO优化与智能配置核心关键词操作指南
如何在IIS服务器上快速部署高效网站?
,网页ppt怎么弄成自己的ppt?
制作宣传网站的软件,小红书可以宣传网站吗?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?
如何通过虚拟主机快速完成网站搭建?
广德云建站网站建设方案与建站流程优化指南
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
北京企业网站设计制作公司,北京铁路集团官方网站?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
简历在线制作网站免费版,如何创建个人简历?
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
建站之星下载版如何获取与安装?
如何确保FTP站点访问权限与数据传输安全?
C#怎么使用委托和事件 C# delegate与event编程方法
如何用PHP工具快速搭建高效网站?
如何在阿里云虚拟服务器快速搭建网站?
如何通过WDCP绑定主域名及创建子域名站点?
建站之家VIP精选网站模板与SEO优化教程整合指南
如何通过服务器快速搭建网站?完整步骤解析
制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?
如何用IIS7快速搭建并优化网站站点?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
建站VPS选购需注意哪些关键参数?
*请认真填写需求信息,我们会在24小时内与您取得联系。