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 ...
随机推荐
- 2017年Web前端开发工程师薪资越来越高?
放眼全球,不仅在国内的互联网行业,在国外,前端工程师一样是需求旺盛.供不应求的香饽饽.所以在供不应求的前端招聘市场上,优秀的前端工程师才是有话语权的那一方. 前端开发是做什么的? 前端是互联网时代软件 ...
- 第45篇 js操作打开本地程序
原文地址:http://blog.laofu.online/2017/06/10/how-js-controlApp/ 背景 假设有这样一个产品,一个web和一个winform客户端,在客户在web的 ...
- HTTP协议入门
1.概述 (1)HTTP是应用层协议,是从Web服务器传输超文本到本地浏览器的传送协议,端口号为80.(2)默认情况下HTTP使用TCP,但是也可以基于以后存在的其他可靠传输协议.由于UDP无法提供可 ...
- mac 安装mysqldb组件包及mac中安装mysql-python遇到的问题
错误1:mysql_config not found 问题描述:在执行sudo pip install mysql-python安装时报错误:EnvironmentError: mysql_confi ...
- position定位和添加阴影
定位:style="position: absolute; bottom: 0; width: 100%;background: rgb(255, 255, 255);padding-bot ...
- CSS3学习系列之盒样式(一)
盒的基本类型 在css中,使用display属性来定义盒的类型,总体上来说,css中的盒分为block类型与inline类型 inline-block类型 inline-block类型是在css2.1 ...
- csv导入数据到mysql
csv表中含有中文字符,具体实现代码示例: load data infile 'C:\\Users\\Administrator\\Desktop\\import\\CELLutf.csv' into ...
- 【Android Developers Training】 38. 文件共享需求
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Example006为弹出窗口加入关闭按钮
<!-- 实例006为弹出的窗口加入关闭按钮 --> <head> <meta charset="UTF-8"> </head> & ...
- 插入多行数据的时候,一个insert插入多行
如:insert into t_users(a,b,c)value('1','2','3'),('3','4','5'),('6','7','8') ('1','2','3'),('3','4','5 ...