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的更多相关文章

  1. Android DrawerLayout 抽屉

    Android DrawerLayout 抽屉 DrawerLayout 在supportV4 Lib在.类似的开源slidemenu如,DrawerLayout父类ViewGroup,自定义组件基本 ...

  2. android DrawerLayout 侧边栏实现

    现在实现侧边栏比较简单了,官方提供的DrawerLayout可以很方便实现. 主要实现方法是:用DrawerLayout 作为界面根控件.在DrawerLayout里面第一个View为当前界面主内容: ...

  3. Android DrawerLayout Plus 增强版抽屉菜单

    DrawerLayout是官方提供的侧滑菜单,相比SliddingMenu,它更加轻量级.默认情况下,DrawerLayout可以设置左侧或者右侧滑出菜单.如下,   xml布局: <!-- & ...

  4. Android DrawerLayout 高仿QQ5.2双向侧滑菜单

    1.概述 之前写了一个Android 高仿 QQ5.0 侧滑菜单效果 自定义控件来袭 ,恰逢QQ5.2又加了一个右侧菜单,刚好看了下DrawerLayout,一方面官方的东西,我都比较感兴趣:另一方面 ...

  5. Android: DrawerLayout 侧滑菜单栏

    DrawerLayout是SupportLibrary包中实现的侧滑菜单效果的控件. 分为主内容区域和侧边菜单区域 drawerLayout本身就支持:侧边菜单根据手势展开与隐藏, 开发者只需要实现: ...

  6. Android DrawerLayout 点击事情穿透

    今天使用DrawerLayout做网易4.4版本侧边栏发现点击DrawerLayout空白部分,下面部分content会获得点击事件.解决方法是在<!-- The navigation draw ...

  7. Android DrawerLayout侧滑菜单

    本教程已经录制视频,欢迎大家观看我在CSDN学院录制的课程:http://edu.csdn.net/lecturer/944

  8. Android DrawerLayout设置左右侧滑菜单为全屏

    我们可以在MainActivity中获取屏幕宽度后动态赋值给侧滑菜单. 在oncreate时 DisplayMetrics metric = new DisplayMetrics(); getWind ...

  9. Android M 控件:Snackbar、Toolbar、TabLayout、NavigationView

    Snackbar Snackbar提供了一个介于Toast和AlertDialog之间轻量级控件,它可以很方便的提供消息的提示和动作反馈.Snackbar的使用与Toast的使用基本相同: Snack ...

随机推荐

  1. JavaScript设计模式_01_单例模式

    最近项目不太忙,难得有时间看看书,平时挺喜欢js这门语言.也看过很多高级教程,觉得自己还是比较热衷于js的设计模式.这一次重温一下<JavaScript设计模式与开发实践>,开篇为单例模式 ...

  2. Python初探

    Q:DBA是运维数据库,为什么还要懂开发? A: 维护:维护的机器太多了,很多重复的操作,需要开发出工具来实现 监控:所有机器的运行情况和健康状况都需要了解,全盘掌握cup.内存.磁盘.网络流量.数据 ...

  3. 最基础的mybatis入门demo

    demo结构 数据库情况 (不会转sql语句 骚瑞) 数据库连接信息 jdbc.properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:m ...

  4. redis五种数据类型

    string Redis的字符串和其他编程语言或者其他键值存储提供的字符串非常相似. 命令 行为 GET 获取存储在给定键中的值 SET 设置存储在给定键中的值 DEL 删除存储在给定中的值(这个命令 ...

  5. TCP慢启动,拥塞控制,ECN 笔记

    TCP慢启动,拥塞控制,ECN 笔记 1,TCP慢启动 TCP在连接过程的三次握手完成后,开始传数据,并不是一开始向网络通道中发送大量的数据包,这样很容易导致网络中路由器缓存空间耗尽,从而发生拥塞:而 ...

  6. Canvas学习系列二:Canvas的坐标系统

    上一章内容中我们对canvas元素有了一个初步的认识,在接下来的章节中我们会慢慢学习canvas中图形的绘制:但是在绘制之前我们先来看看canvas中的坐标系统,因为这样我们才能知道绘制的图形放在什么 ...

  7. 解决其他浏览器没有propertychange事件

    监听实现: /** * Listener.js * 此类用于解决非ie下,通过js改变input的值时, * 无法触发其事件的问题(如:onpropertychange, oninput, oncha ...

  8. 关于Myeclipse不能加载已有项目的问题

    如果缺少.project文件,你可以新建一个同名项目,把Use default location 去掉,选择要加载的项目,完成

  9. vue-cli创建自己的项目

    vue-cli 是一个官方发布 vue.js 项目脚手架,使用 vue-cli 可以快速创建 vue 项目,GitHub地址是:https://github.com/vuejs/vue-cli 一. ...

  10. 破解 Adobe 系列的最佳方法,手把手教

    此方法是个人认为最方便的而且最安全的方法(可以避免下载到可能捆绑病毒的破解版本) 1.首先到Adobe的官网上下载 Creative Cloud: 打开官网上creative cloud 的下载页面: ...