Android DrawerLayout 侧滑菜单

侧滑菜单很常见,比如,打开 QQ,点击左上角的头像,就是一个侧滑菜单了

Android 在 v4 包中引入了官方的侧滑控件 DrawerLayout 让我们可以轻易实现侧滑菜单效果

DrawerLayout

DrawerLayoutandroid.support.v4.widget 命名空间下,可以使用 XML 来创建

<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
        android:id="@+id/ly_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <ListView
        android:id="@+id/list_left_drawer"
        android:layout_width="180dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#080808"
        android:choiceMode="singleChoice"
        android:divider="#FFFFFF"
        android:dividerHeight="1dp" />

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

注意事项

  1. 主内容视图一定要是 DrawerLayout 的第一个子视图,比如 @+id/ly_content

  2. 主内容视图宽度和高度需要 match_parent

  3. 必须 显示 指定侧滑视图的 android:layout_gravity 属性

    1. android:layout_gravity = "start" 时,从左向右滑出菜单
    2. android:layout_gravity = "end" 时,从右向左滑出菜单

    不推荐使用 leftright

  4. 侧滑视图的宽度以 dp 为单位,不建议超过 320dp (为了总能看到一些主内容视图)

  5. 设置侧滑事件

    mDrawerLayout.setDrawerListener(DrawerLayout.DrawerListener);
    
  6. 可以结合 Toolbar 使用当用户点击 Toolbar 上的应用图标,弹出侧滑菜单

范例

下面我们使用 DrawerLayout 创建一个单向的侧滑菜单


  1. 创建一个 空的 Android 项目 cn.twle.android.DrawerLayout

  2. 修改 activity_main.xml ,最外层要是 DrawerLayout

    <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
            android:id="@+id/ly_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
        <ListView
            android:id="@+id/list_left_drawer"
            android:layout_width="180dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:background="#dddddd"
            android:choiceMode="singleChoice"
            android:divider="#eeeeee"
            android:dividerHeight="1dp" />
    
    </android.support.v4.widget.DrawerLayout>
    
  3. res/layout 目录下新建一个 main_content.xml 布局用于显示主要的内容

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <TextView
            android:id="@+id/tv_content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"/>
    
    </RelativeLayout>
    
  4. MainActivity.java 同目录下新建一个 MainContentFragment.java

    package cn.twle.android.drawerlayout;
    
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    
    public class MainContentFragment extends Fragment {
    
        private TextView tv_content;
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.main_content, container, false);
            tv_content = (TextView) view.findViewById(R.id.tv_content);
            String text = getArguments().getString("text");
            tv_content.setText(text);
            return view;
        }
    }
    
  5. 最后修改 MainActivity.java

    package cn.twle.android.drawerlayout;
    
    import android.os.Bundle;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.widget.DrawerLayout;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    
    public class MainActivity extends AppCompatActivity implements AdapterView.OnItemClickListener{
    
        private DrawerLayout drawer_layout;
        private ListView list_left_drawer;
        private ArrayAdapter<String> adapter = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            drawer_layout = (DrawerLayout) findViewById(R.id.drawer_layout);
            list_left_drawer = (ListView) findViewById(R.id.list_left_drawer);
    
            String[] left_menu = {"提醒通知","活动路线","设置","退出"};
    
            adapter = new ArrayAdapter<String>
                    (this,android.R.layout.simple_expandable_list_item_1,left_menu);
    
            list_left_drawer.setAdapter(adapter);
            list_left_drawer.setOnItemClickListener(this);
        }
    
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            MainContentFragment contentFragment = new MainContentFragment();
            Bundle args = new Bundle();
            args.putString("text", adapter.getItem(position));
            contentFragment.setArguments(args);
            FragmentManager fm = getSupportFragmentManager();
            fm.beginTransaction().replace(R.id.ly_content,contentFragment).commit();
            drawer_layout.closeDrawer(list_left_drawer);
        }
    }
    

代码不要太简单,我都觉得没啥好说明的了

参考文档

  1. 官方文档: DrawerLayout

  2. 弘扬大神写过一篇: Android DrawerLayout 高仿 QQ5.2 双向侧滑菜单

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.