当前位置:网站首页>Toolbar 和 DrawerLayout 滑动菜单

Toolbar 和 DrawerLayout 滑动菜单

2022-08-11 05:22:00 hqhe260

Toolbar

还记得我们每次打开的程序的标题栏吗?那不是 tool bar 做的,那是 acti onbar 做的, Tool bar 可以说是

Acti onbar 的升级版了。 Tool bar 不仅有 Acti onbar 的所有功能,而且还更加灵活.

在themes 中将DarkActi onBar 改为 NoActi onBar ,再次运行就可以发现顶端的栏目不见了

 <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:background="#8BD54A"
        app:logo="@mipmap/ss"
        app:menu="@menu/toolbar_item"
        app:navigationIcon="@drawable/ic_baseline_keyboard_arrow_left_24"
        app:subtitle="yes"
        app:subtitleTextColor="@color/black"
        app:title="today is sun"
        app:titleMarginStart="50dp"
        app:titleTextColor="@color/black">



    </androidx.appcompat.widget.Toolbar>

常用属性

属性                                       说明

app:navigationIcon             导航图标,一般情况下放回退按钮,点击退回上一个界面。

android:background               工具栏颜色

app:title                                      标题

app:titleTextColor                     标题文字颜色

app:titleMarginStart                标题与左侧间距

app:subtitle                                     子标题

app:subtitleTextColor                    子标题颜色

app:logo                                    工具栏logo

添加工具栏点击事件

给Toolbar加上id,我们就可以在java代码里获取并监听用户对工具栏图标的点击:

public class MainActivity extends AppCompatActivity {
    private Toolbar toolbar;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toolbar = findViewById(R.id.toolbar);
      
     

        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              
                Toast.makeText(MainActivity.this, "返回", Toast.LENGTH_SHORT).show();
            }
        });

4 溢出菜单

首先我们在res的menu目录中创建一个menu资源文件 toolbar_menu.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

<item android:id="@+id/toolbar_user"
    android:icon="@drawable/ic_baseline_account_circle_24"
    android:title="用户"
    app:showAsAction="never">
</item>
    <item android:id="@+id/toolbar_setting"
        android:icon="@drawable/ic_baseline_settings_24"
        android:title="设置"
        app:showAsAction="never">
    </item>

    <item android:id="@+id/toolbar_add"
        android:icon="@drawable/ic_baseline_add_24"
        android:title="其他"
        app:showAsAction="never">
    </item>


</menu>
在 toolbar中添加   app:menu="@menu/toolbar_item"

2 DrawerLayout 滑动菜单

布局----在这个布局中允许放入两个直接子控件

屏幕中显示的内容

滑动菜单中显示的内容

<android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- 内容区 -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:orientation="vertical">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="20dp"
                android:text="内容区"
                android:textSize="20sp"/>

            <Button
                android:id="@+id/btn_open_left"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="打开左边"/>

            <Button
                android:id="@+id/btn_open_right"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="打开右边"/>

        </LinearLayout>

        <!-- 左边菜单 -->
        <android.support.design.widget.NavigationView
            android:id="@+id/navigation_view"
            android:layout_width="260dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:headerLayout="@layout/drawer_header"
            app:menu="@menu/menu_drawer_left"/>

        <!-- 右边菜单 -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="end"
            android:background="@color/black"
            android:gravity="center"
            android:orientation="vertical">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="20dp"
                android:text="右边菜单"
                android:textColor="@color/white"
                android:textSize="20sp"
                android:textStyle="bold"/>

            <Button
                android:id="@+id/btn_close_right"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="关闭"/>

        </LinearLayout>

    </android.support.v4.widget.DrawerLayout>
  • 外层是DrawerLayout,第一个子view是内容区,侧滑内容紧跟其后。
  • 侧滑内容可以有好几个
  • android:layout_gravity="end" 标识从左边还是右边滑出

点击Toolbar的图标弹出滑出菜单

public class MainActivity extends AppCompatActivity {
    private Toolbar toolbar;
    private DrawerLayout mDrawer;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toolbar = findViewById(R.id.toolbar);
        mDrawer = findViewById(R.id.mDrawer);
       

        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mDrawer.openDrawer(GravityCompat.START);
                //Toast.makeText(MainActivity.this, "返回", Toast.LENGTH_SHORT).show();
            }
        });

NavigationView

滑动窗口里面用TextView太丑了,尝试尝试NavigationView 1 .

引入开源项目 CircleImageView,可以轻松实现图片圆形化

dependencies {   ···   implementation ' de .hdodenhof : ci rcleimageview : 3 . 0 . 1 ' }

创建menu,作为滑动菜单 drawerlayout_men.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <group android:checkableBehavior="single">
        <item
            android:id="@+id/call"
            android:icon="@drawable/ic_baseline_add_24"
           android:title="打电话" >

        </item>
        <item
            android:icon="@drawable/ic_baseline_settings_24"
            android:id="@+id/navFriend"
            android:title="朋友" >

        </item>

        <item
            android:icon="@drawable/ic_baseline_account_circle_24"
            android:id="@+id/navLocation"
            android:title="位置" >

        </item>

</group>
</menu>

3. 在layout创建headerLayout nav_header.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="198dp"
    android:background="@color/teal_200"
    android:padding="10dp">

    <de.hdodenhof.circleimageview.CircleImageView
        android:id="@+id/iconImage"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:layout_centerInParent="true"
        android:src="@mipmap/a" />

    <TextView

        android:layout_width="wrap_content"
android:layout_centerHorizontal="true"
        android:layout_height="wrap_content"
        android:layout_below="@+id/iconImage"
        android:text="平安是福"
       android:id="@+id/aa"
        android:layout_marginTop="15dp"
    android:textSize="20dp"
       >


    </TextView>
</RelativeLayout>

. 修改基本框架

 <com.google.android.material.navigation.NavigationView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
       android:id="@+id/navView"
        android:layout_gravity="start"
        app:headerLayout="@layout/nav_header"
       app:menu="@menu/drawerlayout_men" />

FloatingActionButton 悬浮按钮和可交互提示

基本框架

   <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="16dp"
        android:src="@drawable/ic_baseline_done_outline_24"
        app:elevation="8dp"/>

Snackbar

Toast提示是不是有点拉,可以用Snackbar提示。 但是Toast并非是不如Snackbar,他们有不同的应用场景。

Toast只能告诉用户现在发生了什么事情,用户只能被动接收这件事情。

Snackbar允许在提示中加入一个可交互按钮,当用户点击按钮的时候,就可以执行一些额外的逻辑 操作

 public void onClick(View view) {
                Snackbar.make(view, "是否要删除数据", Snackbar.LENGTH_SHORT).setAction("取消", new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        Toast.makeText(MainActivity.this, "恢复数据", Toast.LENGTH_SHORT).show();
                    }

                }).show();

CoordinatorLayout

但是此时我们会发现Snackbar弹出的时候会把悬浮按钮遮住,但是这个问题我们可以用

CoordinatorLayout解决

CoordinatorLayout可以是一种加强版的FrameLayout(帧布局) CoordinatorLayout会监听所有子控件的各种事件,并且自动帮助我们做出最为合理的响应

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout 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"
    android:id="@+id/mDrawer"
    tools:context=".MainActivity">

<androidx.coordinatorlayout.widget.CoordinatorLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:background="#8BD54A"
        app:logo="@mipmap/ss"
        app:menu="@menu/toolbar_item"
        app:navigationIcon="@drawable/ic_baseline_keyboard_arrow_left_24"
        app:subtitle="yes"
        app:subtitleTextColor="@color/black"
        app:title="today is sun"
        app:titleMarginStart="50dp"
        app:titleTextColor="@color/black">



    </androidx.appcompat.widget.Toolbar>

    <com.google.android.material.floatingactionbutton.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="16dp"
        android:src="@drawable/ic_baseline_done_outline_24"
        app:elevation="8dp"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

其实就是把原本的FrameLayout布局改成了androidx.coordinatorlayout.widget.CoordinatorLayout就 行了 效果就是当点击悬浮按钮Snackbar出现的时候,悬浮按钮会上移来适应Snackbar是自己不会被

Snackbar遮住

但是Snackbar并不是CoordinatorLayout的子控件,而是DrawerLayout的子控件,为什么也能成功 呢?

是因为Snackbar.make()传入了一个view,这是用来指定Snackbar是哪个View触发的,所以传入的是悬浮 按钮控件本身,悬浮按钮控件是CoordinatorLayout的子控件,所以能成功

原网站

版权声明
本文为[hqhe260]所创,转载请带上原文链接,感谢
https://blog.csdn.net/heqiang260/article/details/126200291