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 ...
随机推荐
- .net 利用Emit将object转为DbParameter,DataTable转为List<>
先放测试结果图,测试的方法是拷贝了老赵的一个简单的性能计数器:CodeTimer.发现速度还是比利用反射来获取快了2倍左右的,将object转为DbParameter的反射方法我没写. ...
- nodejs中exports与module.exports的区别详细介绍
如果模块是一个特定的类型就用Module.exports.如果模块是一个典型的"实例化对象"就用exports. exports.name = function() { conso ...
- SQL之trigger(触发器)
先来看一小段程序 有如下三张表: 帐户(编号,姓名,余额,建立日期,储蓄所编号) 储蓄所(编号,名称,地址,人数,所属城市) 借贷(帐户,借贷类型,金额,日期) create trigger tri_ ...
- Docker Daemon 参数最佳实践
1. Docker Daemon 配置参数 限制容器之间网络通信 在同一台主机上若不限制容器之间通信,容器之间就会暴露些隐私的信息,所以推荐关闭 docker daemon –icc=false 使用 ...
- tcp_wrapper 总结
一. 简介 tcp_wrapper:tcp包装器, 工作于库中的. 访问控制 工具/组件 : 传输层 和 接近于应用层; 仅对使用tcp协议且在开发时调用了libwrap相关的服务程序有效. 二. 判 ...
- phpcms V9 后台验证码图片不显示
某个网站在本地运行成功,上传到服务器上后,发现后台登陆的验证码图片不显示 根据网上提供的解决方案, 网站路径变量web_path没问题 database.system的配置路径没问题 apache的G ...
- jeecg 弹出框 点击按钮回调父页面 返回值
jeecg 弹出框 点击按钮回调父页面 返回值 <t:base type="jquery"></t:base> <t:base type=" ...
- Web.config 自动替换值
开发项目中,有些可能会改变的值,如是否记录日志,记录日志路径等,我们都会配置在Web.config的<appSettings></appSettings>节点, 也比如数据库的 ...
- ECMAScript 6 中的快捷语法汇总及代码示例
对于每个 JavaScript 开发人员,快捷语法都是必备技能之一,下面就集中介绍这些快捷语法. 三元运算符 传统写法 const x = 20; let answer; if (x > 10) ...
- 【LeetCode】152. Maximum Product Subarray
题目: Find the contiguous subarray within an array (containing at least one number) which has the larg ...