支持左右侧滑的Drawerlayout及使用基类让Drawerlayout在不同Activity中的显示

先来看效果
这里写图片描述
展开左侧滑菜单
这里写图片描述
展开右侧滑菜单
这里写图片描述

在项目开发中,经常需要在多个场景(Activity)中调用不同的侧滑菜单或窗口,我们常用的实现方式会有使用Popupwindow 和 Dialog等。其实针对这种场景,Android有一个专用的控件DrawerLayout来实现。但我们知道DrawerLayout 必须作为父容器来使用,若需要在每一个需要使用侧滑菜单的布局中都加入这个父容器,则步骤太过繁琐,也不利于后续的修改。

因此我们有一种更加优雅的方式:可以使用基类(BaseActivity)来代替我们来完成这个操作。

先看BaseActivity的布局activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:background="@android:color/transparent">

    <!-- 主内容 -->
    <FrameLayout
        android:id="@+id/content_drawer_layout"
        android:background="@android:color/holo_blue_bright"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!-- 左侧滑动菜单 -->
    <RelativeLayout
        android:id="@+id/main_left_drawer_layout"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        android:layout_gravity="start"/>

    <!-- 右侧滑动菜单 -->
    <RelativeLayout
        android:id="@+id/main_right_drawer_layout"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:fitsSystemWindows="true"
        android:paddingTop="50dp" />

</android.support.v4.widget.DrawerLayout>

直接上BaseActivity的源码

package com.example.myapplication;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.LayoutRes;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;

public class BaseActivity extends AppCompatActivity {
    private final String TAG = getClass().getName();
    private DrawerLayout drawer;
    private RelativeLayout left;
    private RelativeLayout right;
    private FrameLayout content;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        //程序初始化时,关闭手势滑动操作,使不能手势滑出菜单
        drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        initLeftLayout(R.layout.left);
        initRightLayout(R.layout.right);
        initEvent();
    }

    public void initContentLayout(@LayoutRes int layoutResID) {
        //中间内容
        content = (FrameLayout) findViewById(R.id.content_drawer_layout);
        View view = getLayoutInflater().inflate(layoutResID, null);
        content.addView(view);
    }

    public void initLeftLayout(@LayoutRes int layoutResID) {
        //左边菜单
        left = (RelativeLayout) findViewById(R.id.main_left_drawer_layout);
        View view = getLayoutInflater().inflate(layoutResID, null);
        view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        left.addView(view);
    }

    public void initRightLayout(@LayoutRes int layoutResID) {
        //右边菜单
        right = (RelativeLayout) findViewById(R.id.main_right_drawer_layout);
        View view = getLayoutInflater().inflate(layoutResID, null);
        view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        right.addView(view);

    }

    private void initEvent() {
        drawer.addDrawerListener(new DrawerLayout.DrawerListener() {
            @Override
            public void onDrawerSlide(View drawerView, float slideOffset) {
                Log.i(TAG,"onDrawerSlide");
            }

            @Override
            public void onDrawerOpened(View drawerView) {
                Log.i(TAG,"onDrawerOpened");
                //菜单打开后,打开手势滑动操作,使可以手势滑回菜单
                drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
            }

            @Override
            public void onDrawerClosed(View drawerView) {
                Log.i(TAG,"onDrawerClosed");
                //菜单关闭后,再次关闭手势滑动操作,使不能手势滑出
                drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
            }

            @Override
            public void onDrawerStateChanged(int newState) {
                Log.i(TAG,"onDrawerStateChanged");
            }
        });

    }

    //左边菜单开关事件
    public void openLeftLayout() {
        if (drawer.isDrawerOpen(left)) {
            drawer.closeDrawer(left);
        } else {
            drawer.openDrawer(left);
        }
    }


    // 右边菜单开关事件
    public void openRightLayout() {
        if (drawer.isDrawerOpen(right)) {
            drawer.closeDrawer(right);
        } else {
            drawer.openDrawer(right);
        }
    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }
}

Activity

在BaseActivity中,我们使用addView的方法动态地加载内容。
我们只需要将目标Activity继承这个BaseActivity,并重写里面的方法即可。

package com.example.myapplication;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.view.View;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        initContentLayout(R.layout.app_bar_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                openRightLayout();
            }
        });
    }
    public void button(View view){
        openLeftLayout();
    }
}

更详细的对于运行状态的回调方法,将在下一章中介绍。

新人第一篇博客,有不足之处还望多多指教!!

Demo下载

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值