侧面滑出菜单的最小框架

AndroudStudio 中自动生成的带有侧滑菜单的应用模板比较复杂,涉及多个部件,如果只想做一个简单的程序,可以使用下面的框架:

布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <!-- 标题栏,用于取代默认的 ActionBar -->
    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/teal_700"
        android:minHeight="?attr/actionBarSize"
         />

    <!-- 滑出菜单布局,必须在其内部布置主页面及菜单布局 -->
    <androidx.drawerlayout.widget.DrawerLayout
        android:id="@+id/drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- 窗口主界面 -->
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="主界面"
                android:textSize="32dp"
                app:layout_constraintTop_toTopOf="parent"
                tools:layout_editor_absoluteX="42dp" />
        </androidx.constraintlayout.widget.ConstraintLayout>

        <!-- 滑动菜单布局,必须包含 layout_gravity="start" 属性 -->
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:background="@color/menu_bg_color"
            >

            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="菜单界面"
                android:textSize="32dp" />
        </androidx.constraintlayout.widget.ConstraintLayout>

    </androidx.drawerlayout.widget.DrawerLayout>
</LinearLayout>

控件面板上没有DrawerLayout组件,只能手工输入。

MainActivity.java


import androidx.appcompat.app.ActionBarDrawerToggle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import androidx.drawerlayout.widget.DrawerLayout;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.Toast;

import com.google.android.material.snackbar.Snackbar;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    EditText edtInput;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 用 Toolbar 代替的默认的 ActionBar,为消除冲突,需要要在 AndroidManifest.xml 中设置
        // android:theme="@style/Theme.AppCompat.Light.NoActionBar" 属性
        Toolbar toolbar = findViewById(R.id.toolbar1);
        setSupportActionBar(toolbar);
        getSupportActionBar().setHomeButtonEnabled(true); //设置返回键可用
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        
        // 用标题栏左侧的按钮控制左滑菜单的展开与收起
        final DrawerLayout drawerLayout = findViewById(R.id.drawer);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this,drawerLayout,toolbar,R.string.open,R.string.close) {
            @Override
            public void onDrawerOpened(View drawerView) {
                super.onDrawerOpened(drawerView);
            }

            @Override
            public void onDrawerClosed(View drawerView) {
                super.onDrawerClosed(drawerView);
            }
        };
        toggle.syncState();
        drawerLayout.addDrawerListener(toggle);

        Button btnMain = (Button) findViewById(R.id.btnMain);
        btnMain.setOnClickListener(this);
        ImageButton btnSearch = (ImageButton) findViewById(R.id.btnSearch);
        btnSearch.setOnClickListener(this);
    }

    // Drawer 菜单和主窗体都位于同一个布局文件内,因此可以在同一 java 中响应事件
    @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.btnSearch:
                Log.i("infoo", "菜单上的按钮");
                break;
            case R.id.btnMain:
                Log.i("infoo", "主界面上的按钮");
                break;
        }
    }
}

如果要手工切换左滑菜单的显示和隐藏,可以使用下面的方法:
显示:drawerLayout.openDrawer(Gravity.LEFT);
隐藏:drawerLayout.closeDrawer(Gravity.LEFT);

posted @ 2022-02-13 23:16  汉学  阅读(32)  评论(0)    收藏  举报