先来看效果
展开左侧滑菜单
展开右侧滑菜单
在项目开发中,经常需要在多个场景(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();
}
}
更详细的对于运行状态的回调方法,将在下一章中介绍。
新人第一篇博客,有不足之处还望多多指教!!