概述
本篇博客是对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实现抽屉效果
# 主要内容
# 回调
# 应用程序
# 你应该
# 创建一个
# 抽屉里
# 的是
# 几个
# 如果你
# 是在
# 就像
# 你可以
# 子类
# 请点击
# 出现在
# 你在
# 也能
# 做什么
# 会在
# 所需
相关文章:
香港服务器租用每月最低只需15元?
制作网站的公司有哪些,做一个公司网站要多少钱?
如何挑选优质建站一级代理提升网站排名?
道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?
建站之星如何修改网站生成路径?
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
制作旅游网站html,怎样注册旅游网站?
潍坊网站制作公司有哪些,潍坊哪家招聘网站好?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
如何在建站之星网店版论坛获取技术支持?
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
网站制作报价单模板图片,小松挖机官方网站报价?
建站主机无法访问?如何排查域名与服务器问题
建站之星图片链接生成指南:自助建站与智能设计教程
建站之星安装模板失败:服务器环境不兼容?
如何在阿里云虚拟服务器快速搭建网站?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
宁波免费建站如何选择可靠模板与平台?
浅析上传头像示例及其注意事项
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
制作宣传网站的软件,小红书可以宣传网站吗?
移民网站制作流程,怎么看加拿大移民官网?
贸易公司网站制作流程,出口贸易网站设计怎么做?
清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?
网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?
淘宝制作网站有哪些,淘宝网官网主页?
高性价比服务器租赁——企业级配置与24小时运维服务
如何在企业微信快速生成手机电脑官网?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
如何通过商城免费建站系统源码自定义网站主题?
怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?
建站之星免费版是否永久可用?
建站之星后台管理:高效配置与模板优化提升用户体验
东莞专业制作网站的公司,东莞大学生网的网址是什么?
如何通过.red域名打造高辨识度品牌网站?
香港服务器网站生成指南:免费资源整合与高速稳定配置方案
上海网站制作开发公司,上海买房比较好的网站有哪些?
如何高效配置香港服务器实现快速建站?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
济南专业网站制作公司,济南信息工程学校怎么样?
c# 服务器GC和工作站GC的区别和设置
php条件判断怎么写_ifelse和switchcase的使用区别【对比】
中山网站推广排名,中山信息港登录入口?
昆明高端网站制作公司,昆明公租房申请网上登录入口?
在线教育网站制作平台,山西立德教育官网?
,如何利用word制作宣传手册?
制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?
建站之星客服服务时间及联系方式如何?
如何高效生成建站之星成品网站源码?
*请认真填写需求信息,我们会在24小时内与您取得联系。