当前位置:

首页 > 系统应用 > 2.6.4 DrawerLayout(官方侧滑菜单)的简单使用

2.6.4 DrawerLayout(官方侧滑菜单)的简单使用

本节引言: 这一节来说基础 UI 控件里的最后一位:DrawerLayout。它是官方提供的侧滑菜单控件,和上一节提到的 ViewPager 一样,都是在 3.0 之后引入的;如果项目需要兼容更低版本,就得配合 v4 兼容包来用。提到侧滑菜单,很多人应该都接触过 github 上的 SlidingM

本文目录

    本节引言:

    这一节来说基础 UI 控件里的最后一位:DrawerLayout。它是官方提供的侧滑菜单控件,和上一节提到的 ViewPager 一样,都是在 3.0 之后引入的;如果项目需要兼容更低版本,就得配合 v4 兼容包来用。提到侧滑菜单,很多人应该都接触过 github 上的 SlidingMenu,不过它当时大致有两个版本:一个可以单独使用,另一个则需要依赖另一个开源项目 ActionBarSherlock。既然 Google 已经给出了官方方案,其实直接用起来会更顺手;而且在 Material Design 设计规范里,很多常见的侧滑菜单动画效果,基本都能通过 Toolbar + DrawerLayout 这套组合实现。这一节就围绕 DrawerLayout 的基础用法展开,顺带一提,也有不少人会把它叫作“抽屉控件”。官方文档:DrawerLayout

    1.使用的注意事项

    • 1.主内容视图一定要是DrawerLayout的第一个子视图
    • 2.主内容视图宽度和高度需要match_parent
    • 3.必须显示指定侧滑视图的android:layout_gra vity属性 android:layout_gra vity = "start"时,从左向右滑出菜单 android:layout_gra vity = "end"时,从右向左滑出菜单 不推荐使用left和right!!!
    • 侧滑视图的宽度以dp为单位,不建议超过320dp(为了总能看到一些主内容视图)
    • 设置侧滑事件:mDrawerLayout.setDrawerListener(DrawerLayout.DrawerListener);
    • 要说一点:可以结合Actionbar使用当用户点击Actionbar上的应用图标,弹出侧滑菜单! 这里就要通过ActionBarDrawerToggle,它是DrawerLayout.DrawerListener的具体实现类, 我们可以重写ActionBarDrawerToggle的onDrawerOpened()和onDrawerClosed()以监听抽屉拉出 或隐藏事件!但是这里我们不讲,因为5.0后我们使用的是Toolbar!有兴趣的可以自行查阅相关 文档!

    2.使用代码示例

    示例1:单个侧滑菜单的实现

    运行效果图:

    实现关键代码:

    首先是我们的主布局,注意:最外层要是DrawerLayout哦!!!!

    activity_main.xml:

    
    
    
    

    接着ListView的布局代码和domain类:Item比较简单,就不给出了,直接上中间Fragment的 布局以及代码吧!另外Adapter直接复用我们之前写的那个可复用的MyAdapter!

    fg_content.xml:

    
    
    
    

    ContentFragment.ja va:

    /**
     * Created by Jay on 2015/10/8 0008.
     */
    public class ContentFragment extends Fragment {
    private TextView tv_content;
    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa vedInstanceState) {
            View view = inflater.inflate(R.layout.fg_content, container, false);
            tv_content = (TextView) view.findViewById(R.id.tv_content);
            String text = getArguments().getString("text");
            tv_content.setText(text);
            return view;
        }
    }   

    最后是我们的Activity类

    MainActivity.ja va:

    public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener{
    private DrawerLayout drawer_layout;
        private ListView list_left_drawer;
        private ArrayList menuLists;
        private MyAdapter myAdapter = null;
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
    drawer_layout = (DrawerLayout) findViewById(R.id.drawer_layout);
            list_left_drawer = (ListView) findViewById(R.id.list_left_drawer);
    menuLists = new ArrayList();
            menuLists.add(new Item(R.mipmap.iv_menu_realtime,"实时信息"));
            menuLists.add(new Item(R.mipmap.iv_menu_alert,"提醒通知"));
            menuLists.add(new Item(R.mipmap.iv_menu_trace,"活动路线"));
            menuLists.add(new Item(R.mipmap.iv_menu_settings,"相关设置"));
            myAdapter = new MyAdapter(menuLists,R.layout.item_list) {
                @Override
                public void bindView(ViewHolder holder, Item obj) {
                    holder.setImageResource(R.id.img_icon,obj.getIconId());
                    holder.setText(R.id.txt_content, obj.getIconName());
                }
            };
            list_left_drawer.setAdapter(myAdapter);
            list_left_drawer.setOnItemClickListener(this);
        }
    @Override
        public void onItemClick(AdapterView parent, View view, int position, long id) {
            ContentFragment contentFragment = new ContentFragment();
            Bundle args = new Bundle();
            args.putString("text", menuLists.get(position).getIconName());
            contentFragment.setArguments(args);
            FragmentManager fm = getSupportFragmentManager();
            fm.beginTransaction().replace(R.id.ly_content,contentFragment).commit();
            drawer_layout.closeDrawer(list_left_drawer);
        }
    }

    代码很简单,就不多说了~

    示例2.左右两个侧滑菜单的实现

    嗯,不知道你有没有发现,从上面的DrawerLayout的布局,我们大概可以猜到,DrawerLayout 最多由三个部分组成,中间的内容部分,左边的侧滑菜单部分,右边的侧滑菜单部分组成! 下面我们来写一个带有两个侧滑菜单的示例!

    运行效果图:

    代码实现:

    首先我们创建两个Fragment以及对应的布局,他们分别是左右侧滑菜单!

    左边Fragment:

    布局:fg_left.xml,这里就用了一个图片而以,点击后弹出一个新的Activity; 当然你可以根据自己的需求进行扩展!

    
    
    
    

    对应的LeftFragment.ja va:

    /**
     * Created by Jay on 2015/10/9 0009.
     */
    public class LeftFragment extends Fragment{
    private DrawerLayout drawer_layout;
    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa vedInstanceState) {
            View view = inflater.inflate(R.layout.fg_left, container, false);
            ImageView img_bg = (ImageView) view.findViewById(R.id.img_bg);
            img_bg.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    getActivity().startActivity(new Intent(getActivity(),OtherActivity.class));
                    drawer_layout.closeDrawer(Gra vity.START);
                }
            });
            return view;
        }
    //暴露给Activity,用于传入DrawerLayout,因为点击后想关掉DrawerLayout
        public void setDrawerLayout(DrawerLayout drawer_layout){
            this.drawer_layout = drawer_layout;
        }
    }

    右面的Fragment:

    布局就三个按钮,点击后替换中间部分的Fragment,布局fg_right.xml代码如下:

    
    
    

    然后对应的是RightFragment.ja va:

    /**
     * Created by Jay on 2015/10/9 0009.
     */
    public class RightFragment extends Fragment implements View.OnClickListener{
    private DrawerLayout drawer_layout;
        private FragmentManager fManager;
    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa vedInstanceState) {
            View view = inflater.inflate(R.layout.fg_right, container, false);
            view.findViewById(R.id.btn_one).setOnClickListener(this);
            view.findViewById(R.id.btn_two).setOnClickListener(this);
            view.findViewById(R.id.btn_three).setOnClickListener(this);
            fManager = getActivity().getSupportFragmentManager();
            return view;
        }
    @Override
        public void onClick(View v) {
            switch (v.getId()){
                case R.id.btn_one:
                    ContentFragment cFragment1 = new ContentFragment("1.点击了右侧菜单项一",R.color.blue);
                    fManager.beginTransaction().replace(R.id.fly_content,cFragment1).commit();
                    drawer_layout.closeDrawer(Gra vity.END);
                    break;
                case R.id.btn_two:
                    ContentFragment cFragment2 = new ContentFragment("2.点击了右侧菜单项二",R.color.red);
                    fManager.beginTransaction().replace(R.id.fly_content,cFragment2).commit();
                    drawer_layout.closeDrawer(Gra vity.END);
                    break;
                case R.id.btn_three:
                    ContentFragment cFragment3 = new ContentFragment("3.点击了右侧菜单项三",R.color.yellow);
                    fManager.beginTransaction().replace(R.id.fly_content,cFragment3).commit();
                    drawer_layout.closeDrawer(Gra vity.END);
                    break;
            }
        }
    public void setDrawerLayout(DrawerLayout drawer_layout){
            this.drawer_layout = drawer_layout;
        }
    }

    另外还有一个中间部分填充的ContentFragment,布局:fg_content.xml如下:

    
    
    
    

    ContentFragment.ja va:

    public class ContentFragment extends Fragment {
    private TextView tv_content;
        private String strContent;
        private int bgColor;
    public ContentFragment(String strContent,int bgColor) {
            this.strContent = strContent;
            this.bgColor = bgColor;
        }
    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa vedInstanceState) {
            View view = inflater.inflate(R.layout.fg_content, container, false);
            view.setBackgroundColor(getResources().getColor(bgColor));
            tv_content = (TextView) view.findViewById(R.id.tv_content);
            tv_content.setText(strContent);
            return view;
        }
    }

    编写好以后,就到我们的Activity的布局了以及Activity的代码了: 在此之前我们还需要些一个顶部条形栏的布局:

    view_topbar.xml:

    
    
    

    然后是activity_main.xml:

    
    
    
    
    
    
    
      

    最后是MainActivity.ja va:

    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private DrawerLayout drawer_layout;
        private FrameLayout fly_content;
        private View topbar;
        private Button btn_right;
        private RightFragment fg_right_menu;
        private LeftFragment fg_left_menu;
        private FragmentManager fManager;
    @Override
        protected void onCreate(Bundle sa vedInstanceState) {
            super.onCreate(sa vedInstanceState);
            setContentView(R.layout.activity_main);
            fManager = getSupportFragmentManager();
            fg_right_menu = (RightFragment) fManager.findFragmentById(R.id.fg_right_menu);
            fg_left_menu = (LeftFragment) fManager.findFragmentById(R.id.fg_left_menu);
            initViews();
        }
    private void initViews() {
            drawer_layout = (DrawerLayout) findViewById(R.id.drawer_layout);
            fly_content = (FrameLayout) findViewById(R.id.fly_content);
            topbar = findViewById(R.id.topbar);
            btn_right = (Button) topbar.findViewById(R.id.btn_right);
            btn_right.setOnClickListener(this);
    //设置右面的侧滑菜单只能通过编程来打开
            drawer_layout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED,
                    Gra vity.END);
    drawer_layout.setDrawerListener(new DrawerLayout.DrawerListener() {
                @Override
                public void onDrawerSlide(View view, float v) {
    }
    @Override
                public void onDrawerOpened(View view) {
    }
    @Override
                public void onDrawerClosed(View view) {
                    drawer_layout.setDrawerLockMode(
                            DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gra vity.END);
                }
    @Override
                public void onDrawerStateChanged(int i) {
    }
            });
    fg_right_menu.setDrawerLayout(drawer_layout);
            fg_left_menu.setDrawerLayout(drawer_layout);
        }
    @Override
        public void onClick(View v) {
            drawer_layout.openDrawer(Gra vity.RIGHT);
            drawer_layout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED,
                    Gra vity.END);    //解除锁定
        }
    }

    好的,至此就大功告成了~,呼呼,下面说下看代码时可能会有的疑惑:

    • 1. drawer_layout.openDrawer(Gra vity.END);
      这句是设置打开的哪个菜单START代表左边,END代表右边
    • 2. drawer_layout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED,Gra vity.END); 锁定右面的侧滑菜单,不能通过手势关闭或者打开,只能通过代码打开!即调用openDrawer方法! 接着 drawer_layout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED,Gra vity.END); 解除锁定状态,即可以通过手势关闭侧滑菜单 最后在drawer关闭的时候调用: drawer_layout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, Gra vity.END); 再次锁定右边的侧滑菜单!
    • 3. 布局代码中的Tag属性的作用? 答:这里没用到,在重写DrawerListener的onDrawerSlide方法时,我们可以通过他的第一个 参数drawerView,调用drawerView.getTag().equals("START")判断触发菜单事件的是哪个 菜单!然后可以进行对应的操作!

    3.代码示例下载

    DrawerLayoutDemo.zip

    DrawerLayoutDemo2.zip

    本节小结:

    这一节主要梳理了官方侧滑控件DrawerLayout的基础用法,整体上手并不复杂,用起来也相当顺手。这里展示的还是偏入门的基础示例,重点在于先把常规用法跑通。除此之外,之前也有人写过一篇:Android DrawerLayout 高仿QQ5.2双向侧滑菜单。要是已经把本节内容看明白了,再去读这篇扩展案例,理解起来通常就会轻松不少。

    本节就到这里,跟UI控件这一章说拜拜了~下一章我们开始绘图与动画了, 为我们进阶部分的自定义控件系列打基础!

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    系统应用
    相关文章 更多
    AutoDraw可以导入本地图片识别已有草稿吗
    AutoDraw可以导入本地图片识别已有草稿吗

    autodraw原生功能的导入属性说明官方推出的在线原版autodraw,从设计定位上来说是一款从零创作的在线绘图工具,本身确实没有预设本地图片上传,这也是很多用户误以为它完全不能导入本地图片的核心原因。但这不代表本地图片完全无法导入,借助浏览器的剪贴板特性和第三方适配版本,我们完全可以实现本地草稿

    C#使用System.Drawing实现位图取色与绘图的方法
    C#使用System.Drawing实现位图取色与绘图的方法

    在C#里,想用System.Drawing处理位图,做取色、绘图这类操作,其实比想象中要简单不少。直接上几句核心代码,就能把屏幕颜色抓下来,或者往图片上画个圈。下面就把关键方法拆开聊聊,顺便附上一个完整的交互示例,方便你直接上手跑。 1. 提取鼠标指定点的颜色值 要获取屏幕上任意一点的颜色,最直接的

    AutoDraw手绘板能用吗
    AutoDraw手绘板能用吗

    在数字化绘画大行其道的今天,手绘板几乎成了创作者们的标配。而AutoDraw手绘板,作为这个品类中一个值得关注的产品,它的外接设备兼容性到底怎么样?值不值得入手?今天就来聊聊这个。 先看和电脑的配合。主流操作系统,比如Windows和macOS,基本都能很好地支持这款手绘板。连接方式很简单:用USB

    AutoDraw手机版如何打开-AutoDraw移动端绘图操作指南
    AutoDraw手机版如何打开-AutoDraw移动端绘图操作指南

    在这个电子设备几乎无所不能的时代,画画早就不是纸笔的专利了。Autodraw手机版的出现,让涂鸦、设计、随手记录灵感,变得像刷朋友圈一样简单。但很多人第一次打开它时,可能会有点懵:这玩意儿到底怎么用?别急,下面就从下载到上手,一步步把这个移动端绘图工具给讲透。 一、下载autodraw手机版 操作门

    AutoDraw画不准如何解决-提升AutoDraw的AI识别率有哪些小技巧
    AutoDraw画不准如何解决-提升AutoDraw的AI识别率有哪些小技巧

    用AutoDraw画画时,很多人都会遇到“手残”时刻——明明心里想的是个圆,画出来却像个土豆。这不但影响心情,AI识别也常常翻车。别急着叹气,这里有几个小窍门,能让识别率直线上升。 保持绘图简洁 别跟AI较劲,画得太复杂反而适得其反。AutoDraw的AI擅长识别常见图形,那些密密麻麻的线条和装饰细

    AutoDraw能画彩色图吗-AutoDraw图层填充上色攻略
    AutoDraw能画彩色图吗-AutoDraw图层填充上色攻略

    很多新手设计师和手绘爱好者第一次接触AutoDraw时,几乎都会问同一个问题:这玩意儿到底能不能画彩色的?作为Google出品的轻量级在线绘图工具,大家对它的印象往往停留在“快速生成AI线稿”的阶段。其实,它完全能支撑彩色创作,关键在于搞清楚图层和上色的逻辑。只要掌握了这几点,你也能快速画出干净清爽

    AutoDraw怎么导出高清图-AutoDraw画作保存分享方法
    AutoDraw怎么导出高清图-AutoDraw画作保存分享方法

    在使用AutoDraw创作时,很多人都会琢磨一个问题:怎么才能把画作以高清版本保存下来,方便展示或者分享给朋友?其实呢,方法并不复杂,下面就来详细拆解一下。先得说个关键点:当你在AutoDraw完成一幅满意的画作后,点击右上角的“下载”按钮——这是获取作品的基础操作,所有后续步骤都从这里开始。下载完

    哪里找AutoDraw教程-AutoDraw超全视频图文教程指南
    哪里找AutoDraw教程-AutoDraw超全视频图文教程指南

    先说个很多人不知道的:谷歌出过一个叫AutoDraw的免费在线绘图工具,不需要任何软件基础,画个歪歪扭扭的草图,它能自动识别,一秒生成专业级矢量图。对不会PS、不想买绘图会员、又需要做手账插图、新媒体配图、产品原型图的人来说,这工具简直是降维打击。但问题来了——全网搜一圈,系统教程寥寥无几,零散不成

    AutoDraw学生党如何使用-实用教程教你用AutoDraw制作课件插图
    AutoDraw学生党如何使用-实用教程教你用AutoDraw制作课件插图

    在学生时代,做课件是家常便饭,而一张出彩的插图往往能让整个作品瞬间提升一个档次。问题在于,不是每个人都有美术天赋,画个简单的细胞结构都能让人笑出声。不过,最近发现了一款工具——autodraw,它几乎成了学生党的“救星”。 一、autodraw简介 autodraw 本质上是一个基于人工智能的绘图助

    AutoDraw真能让零基础画画吗?实测小白用AutoDraw能否变画师
    AutoDraw真能让零基础画画吗?实测小白用AutoDraw能否变画师

    AutoDraw作为零基础绘画工具,操作简单,用鼠标随意画几笔即可快速匹配精准图形。实测绘制猫和房子均在一两分钟内完成,效果流畅且提供多种风格选项,能激发创意细节。虽不能使人成为专业画师,但有助于建立基础构图感和绘画信心。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。