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 ...
随机推荐
- 一天搞定CSS:边框border--02
每一个标签都是一个盒子,具体见HTML教程 因此,每一个标签有大小,有边框 1.border样式:单一样式 2.border样式:复合样式 border: 粗细 类型 颜色: 3.border方向 4 ...
- 【Web开发】Mean web开发 01-Express实现MVC模式开发
简介 Mean是JavaScript的全栈开发框架.更多介绍 用Express实现MVC模式开发是Mean Web全栈开发中的一部分. Express 是一个基于 Node.js 平台的极简.灵活的 ...
- Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property 'URIType' of bean class [com.alibaba.citrus.service.uribroker.uri.GenericURIBroker]
linux中的JDK为JDK8,tomcat为tomcat8 加入dubbo.war包 启动报错! Caused by: org.springframework.beans.factory.BeanC ...
- DiscuzX3.1搬家全过程
最近做了一个安全交流小社区,由于太卡了,之后换了服务器,要给论坛搬家 所以在这里写一下记录. 首先,搬家前要做好以下准备: 1.在网站后台-站长-数据库-备份-网站-Discuz! 和 UCenter ...
- Java之IO流详解
IO流 Input/Output 完成输入/输出 应用程序运行时——数据在内存中 ←→ 把数据写入硬盘(磁带) 内存中的数据不可持久保存的 输入:从外部存储器(硬盘.磁带.U盘)把数据读入内存. ...
- 每天一个JS 小demo之新建文件夹。主要知识点:DOM方法的综合运用
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"& ...
- vue.js实现数据动态响应(Vue.set的应用)
在vue里面,我们操作最多的就是各种数据,在jquery里面,我们习惯通过下标定向找到数据,然后重新赋值 比如var a[0]=111;(希望上家公司原谅菜鸟的我写了不少这样的代码
- 基于Jmeter的轻量级接口压力测试(一)
一.操作步骤: 1.在测试计划下新增一个线程组,并在线程组下新增一个http请求: 2.读取配置文件中的参数:在添加的http请求下添加配置元件-CSV DATA SET CONFIG 3.配置待测试 ...
- navicat 连接oracle数据库报错:ORA-28547:connection to server failed,probable Oracle Net admin error
链接:http://pan.baidu.com/s/1dEO9qJR 密码:ye2c 用Navicat连接Oracle数据库时出现如下错误 上网一查原来是oci.dll版本不对.因为Navicat是通 ...
- markdown基础
介绍: markdown是一种可以使用普通文本编译器编写的标记语言,通过简单的标记语法,它可以使普通文本具有一定的格式.说的简单一点,markdown其实就是一种简单的文本,与普通的文本文件(txt文 ...