Android - DrawerLayout
Android DrawerLayout 的使用
Android L Android Studio 1.4
从主视图左侧能抽出一个导航栏,效果图:
点击后弹出新界面: 
新界面也可以抽出左侧导航栏

1.配置xml文件,指定根视图和左右抽屉视图
2.Activity中加载xml文件,设定UI动作
代码
首先配置 main_layout.xml 文件;用v4包里的DrawerLayout,指定一个FrameLayout作为根视图,后续可以把Fragment插入到这个FrameLayout中
抽屉视图是一个RelativeLayout,里面承载着几个UI,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">
<!-- 指定Framelayout为根视图 -->
<FrameLayout
android:id="@+id/root_framelayout"
android:layout_width="match_parent"
android:layout_height="match_parent"></FrameLayout>
<!-- The left navigation drawer -->
<RelativeLayout
android:id="@+id/left_relative_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#ffffcc"
android:clickable="true"><!-- clickable="true" 防止点击事件穿透 -->
<ImageButton
android:id="@+id/imagebtn_left_head"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_centerHorizontal="true"
android:layout_marginTop="20dp"
android:background="@drawable/littleboygreen"
android:scaleType="fitXY" />
<ListView
android:id="@+id/left_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/imagebtn_left_head"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="10dp"
android:paddingTop="5dp"></ListView>
<Button
android:id="@+id/btn_left_exit"
android:layout_width="140dp"
android:layout_height="wrap_content"
android:layout_below="@id/left_list"
android:layout_centerInParent="true"
android:layout_marginTop="50dp"
android:background="@drawable/button_corner_shape"
android:text="退出应用"
android:textSize="20sp" />
<Button
android:id="@+id/btn_left_confirm"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:layout_below="@id/left_list"
android:layout_marginLeft="30dp"
android:layout_marginTop="50dp"
android:background="@drawable/button_corner_shape"
android:text="退出"
android:textSize="20sp" />
<Button
android:id="@+id/btn_left_cancel"
android:layout_width="70dp"
android:layout_height="wrap_content"
android:layout_below="@id/left_list"
android:layout_marginLeft="40dp"
android:layout_marginTop="50dp"
android:layout_toRightOf="@id/btn_left_confirm"
android:background="@drawable/button_cancel_corner_shape"
android:text="取消"
android:textSize="20sp" />
</RelativeLayout>
</android.support.v4.widget.DrawerLayout>
在MainActivity.java的onCreate方法中加载这个layout
setContentView(R.layout.main_layout);
主视图就只有一张背景,新写一个MainFragment加载进去
MainFragment.java
public class MainFragment extends Fragment {
......
private Toolbar toolbar;
......
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.main_relativelayout, container,false);
/* 这里设置UI,设置按钮监听等等 */
/* 为防止单调,显示放屏幕分辨率和屏幕方向 */
return rootView;
}
/* 屏幕分辨率 */
private String getScreenRatio(){
StringBuilder ratio = new StringBuilder("");
mDisplay = ((WindowManager)getActivity().getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay();/* 先getActivity */
DisplayMetrics mDisplayMetrics = new DisplayMetrics();
mDisplay.getMetrics(mDisplayMetrics);
mDisplay.getSize(mCurrentDisplaySize);/* 竖屏Point(1536, 1964) 横屏Point(2048, 1452) */
Log.d("rust","mCurrentDisplaySize "+ mCurrentDisplaySize);
int screenWidth = mDisplayMetrics.widthPixels;
int screenHeight = mDisplayMetrics.heightPixels;
ratio.append(screenWidth);
ratio.append(" x ");
ratio.append(screenHeight);
return ratio.toString();
}
/* 获取屏幕方向 */
private void getOrientation() {
config = getResources().getConfiguration();/* 检查屏幕方向 */
if (config.orientation == Configuration.ORIENTATION_LANDSCAPE){
screenOrientation = "LANDSCAPE";
} else if (config.orientation == Configuration.ORIENTATION_PORTRAIT) {
screenOrientation = "PORTRAIT";
} else {
screenOrientation = "Unknow";
}
}
}
回到MainActivity.java的onCreate方法,把MainFragment加载进去
mainFragment = new MainFragment();/* 指定一个单独的Fragment */ ...... final FragmentManager fragmentManager = getFragmentManager();/* 加载到root容器 */ fragmentManager.beginTransaction().add(R.id.root_framelayout, mainFragment).commit();
同样在MainActivity.java的onCreate方法中加载一下导航栏
/* 左抽屉 */
leftDrawer = (RelativeLayout) findViewById(R.id.left_relative_drawer);
/* 左列表在左抽屉里 */
leftList = (ListView) leftDrawer.findViewById(R.id.left_list);
/* 适配器装载数据;即初始化导航列表;这里使用SimpleAdapter,加载自定义的LinearLayout作为按钮 */
contentLeftAdapter = new SimpleAdapter(this, leftDrawerListData(),
R.layout.list_item_linearlayout, new String[]{"image","text"},
new int[]{R.id.image_left_item,R.id.tv_left_item});
leftList.setAdapter(contentLeftAdapter);
/* 为list设置ClickListener;DrawerOnItemClickListener定义在下面*/
leftList.setOnItemClickListener(new DrawerOnItemClickListener());
imageBtnLeft.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
fragmentManager.beginTransaction()
.replace(R.id.root_framelayout, mainFragment)
.commit();
mDrawerLayout.closeDrawer(leftDrawer);
}
});
btnExit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btnConfirmExit.setVisibility(View.VISIBLE);
btnCancelExit.setVisibility(View.VISIBLE);
btnExit.setVisibility(View.INVISIBLE);
}
});
btnCancelExit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
btnCancelExit.setVisibility(View.INVISIBLE);
btnConfirmExit.setVisibility(View.INVISIBLE);
btnExit.setVisibility(View.VISIBLE);
}
});
btnConfirmExit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// finish();
android.os.Process.killProcess(android.os.Process.myPid());
}
});
往listview中添加内容的方法
private List<Map<String, Object>> leftDrawerListData(){
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("image", R.drawable.orange01);
map.put("text", "橘子");
list.add(map);
map = new HashMap<String, Object>();
map.put("image", R.drawable.sixtraveltransportation);
map.put("text", "路标");
list.add(map);
map = new HashMap<String, Object>();
map.put("image", R.drawable.traintraveltransportation);
map.put("text", "火车");
list.add(map);
map = new HashMap<String, Object>();
map.put("image", R.drawable.ecologytree);
map.put("text", "树苗");
list.add(map);
map = new HashMap<String, Object>();
map.put("image", R.drawable.ecology);
map.put("text", "插头");
list.add(map);
return list;
}
导航栏按钮监听
private class DrawerOnItemClickListener implements AdapterView.OnItemClickListener{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
seleteItem(position);/* 按钮选择 */
}
}
private void seleteItem(int position){
leftList.setItemChecked(position, true);
Fragment newFragment = new ContentFragment();/* new 一个子fragment */
Bundle args = new Bundle();
args.putInt(ContentFragment.ARG_SHOW_FRAGMENT,position);
newFragment.setArguments(args);/* 装载数据 */
FragmentManager childFragmentManager = getFragmentManager();
childFragmentManager.beginTransaction()
.replace(R.id.root_framelayout, newFragment)
.commit();/* 替换当前fragment */
/* 最后关闭左侧抽屉 */
mDrawerLayout.closeDrawer(leftDrawer);
}
点击一下导航栏的按钮,就会把原来的MainFragment替换掉
DrawerLayout往往和Fragment结合起来使用;布局界面可以更丰富和灵活
如果跳到另一个Activity,就抽不出MainActivity的DrawerLayout
Android - DrawerLayout的更多相关文章
- Android DrawerLayout 抽屉
Android DrawerLayout 抽屉 DrawerLayout 在supportV4 Lib在.类似的开源slidemenu如,DrawerLayout父类ViewGroup,自定义组件基本 ...
- android DrawerLayout 侧边栏实现
现在实现侧边栏比较简单了,官方提供的DrawerLayout可以很方便实现. 主要实现方法是:用DrawerLayout 作为界面根控件.在DrawerLayout里面第一个View为当前界面主内容: ...
- Android DrawerLayout Plus 增强版抽屉菜单
DrawerLayout是官方提供的侧滑菜单,相比SliddingMenu,它更加轻量级.默认情况下,DrawerLayout可以设置左侧或者右侧滑出菜单.如下, xml布局: <!-- & ...
- Android DrawerLayout 高仿QQ5.2双向侧滑菜单
1.概述 之前写了一个Android 高仿 QQ5.0 侧滑菜单效果 自定义控件来袭 ,恰逢QQ5.2又加了一个右侧菜单,刚好看了下DrawerLayout,一方面官方的东西,我都比较感兴趣:另一方面 ...
- Android: DrawerLayout 侧滑菜单栏
DrawerLayout是SupportLibrary包中实现的侧滑菜单效果的控件. 分为主内容区域和侧边菜单区域 drawerLayout本身就支持:侧边菜单根据手势展开与隐藏, 开发者只需要实现: ...
- Android DrawerLayout 点击事情穿透
今天使用DrawerLayout做网易4.4版本侧边栏发现点击DrawerLayout空白部分,下面部分content会获得点击事件.解决方法是在<!-- The navigation draw ...
- Android DrawerLayout侧滑菜单
本教程已经录制视频,欢迎大家观看我在CSDN学院录制的课程:http://edu.csdn.net/lecturer/944
- Android DrawerLayout设置左右侧滑菜单为全屏
我们可以在MainActivity中获取屏幕宽度后动态赋值给侧滑菜单. 在oncreate时 DisplayMetrics metric = new DisplayMetrics(); getWind ...
- Android M 控件:Snackbar、Toolbar、TabLayout、NavigationView
Snackbar Snackbar提供了一个介于Toast和AlertDialog之间轻量级控件,它可以很方便的提供消息的提示和动作反馈.Snackbar的使用与Toast的使用基本相同: Snack ...
随机推荐
- JavaScript设计模式_01_单例模式
最近项目不太忙,难得有时间看看书,平时挺喜欢js这门语言.也看过很多高级教程,觉得自己还是比较热衷于js的设计模式.这一次重温一下<JavaScript设计模式与开发实践>,开篇为单例模式 ...
- Python初探
Q:DBA是运维数据库,为什么还要懂开发? A: 维护:维护的机器太多了,很多重复的操作,需要开发出工具来实现 监控:所有机器的运行情况和健康状况都需要了解,全盘掌握cup.内存.磁盘.网络流量.数据 ...
- 最基础的mybatis入门demo
demo结构 数据库情况 (不会转sql语句 骚瑞) 数据库连接信息 jdbc.properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:m ...
- redis五种数据类型
string Redis的字符串和其他编程语言或者其他键值存储提供的字符串非常相似. 命令 行为 GET 获取存储在给定键中的值 SET 设置存储在给定键中的值 DEL 删除存储在给定中的值(这个命令 ...
- TCP慢启动,拥塞控制,ECN 笔记
TCP慢启动,拥塞控制,ECN 笔记 1,TCP慢启动 TCP在连接过程的三次握手完成后,开始传数据,并不是一开始向网络通道中发送大量的数据包,这样很容易导致网络中路由器缓存空间耗尽,从而发生拥塞:而 ...
- Canvas学习系列二:Canvas的坐标系统
上一章内容中我们对canvas元素有了一个初步的认识,在接下来的章节中我们会慢慢学习canvas中图形的绘制:但是在绘制之前我们先来看看canvas中的坐标系统,因为这样我们才能知道绘制的图形放在什么 ...
- 解决其他浏览器没有propertychange事件
监听实现: /** * Listener.js * 此类用于解决非ie下,通过js改变input的值时, * 无法触发其事件的问题(如:onpropertychange, oninput, oncha ...
- 关于Myeclipse不能加载已有项目的问题
如果缺少.project文件,你可以新建一个同名项目,把Use default location 去掉,选择要加载的项目,完成
- vue-cli创建自己的项目
vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一. ...
- 破解 Adobe 系列的最佳方法,手把手教
此方法是个人认为最方便的而且最安全的方法(可以避免下载到可能捆绑病毒的破解版本) 1.首先到Adobe的官网上下载 Creative Cloud: 打开官网上creative cloud 的下载页面: ...