Android 悬浮按钮 FloatingActionButton 和交互提示 SnackBar

本文介绍了Android中Material Design的FloatingActionButton和SnackBar的使用方法。FloatingActionButton是右下角的悬浮按钮,可通过app:elevation调整阴影效果。SnackBar则是提供交互的底部提示,与Toast不同,它可以包含操作按钮。解决SnackBar遮挡悬浮按钮的问题,可以借助CoordinatorLayout布局,它能监听子控件事件并作出相应布局调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

      今天是我们分享的关于 Material Design 的第五篇文章了,今天给大家简单分享 FloatingActionButton 和 Snackbar 这两个 Material Design 小控件用法,通过之前几篇博文的相关的对 Material Design 的介绍,大家对 Material Design 也有了一些了解,本篇我们来接着学习上面说到的两个简单的小控件,FloatingActionButton 其实就是我们看到的悬浮按钮,SnackBar 则是底部弹出的一个小型交互控件,接下来我们开始来演绎


一、悬浮按钮 FloatingActionButton


这里我们直接上 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:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#c7c6c6">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolBar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/colorPrimary"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:titleTextColor="#f5f0f0" />

        <android.support.design.widget.FloatingActionButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_margin="18dp"
            android:elevation="20dp"
            android:src="@mipmap/pen"
            app:backgroundTint="#0882f4" />


    </FrameLayout>


    <android.support.design.widget.NavigationView
        android:id="@+id/navigation"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        app:headerLayout="@layout/navigation_head"
        app:menu="@menu/navigation">

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

       这里我们是接着上一篇的博文代码来敲的,相信看过上一篇的大家也很明白,不过没有看过的也不要紧,这里我们只是在主布局中增加了 FlaotingActionButton,即今天我们要实现的功能,这里需要注意的就是,FlaotingActionButton 按钮会默认使用 colorAccent 来作为按钮的颜色,如果要更改的话也可以通过 app:backgroundTint 属性来设置,这里我们通过 layout_gravity 把悬浮按钮设置到右下角,然后通过 layout_margin 属性给控件四周留点距离,最后通过 src 属性来设置了图标,就这么简单,我们就实现了,效果图如下:




       这样悬浮按钮就在右下方出现了,仔细看会发现按钮下面还有阴影,这也是 Material Design 设计的风格体现,另外我们还可以通过 app:elevation 来指定一个高度值,高度值越大,投影范围也越大,高度值越小,投影范围也越小,投影的效果越浓,当然这些效果都不是特别的明显,接下来我们来看如何实现 FlaotingActionButton 的点击事件


MainActivity 中的代码如下:

public class MainActivity extends AppCompatActivity {

    private DrawerLayout mDrawerLayout;

    private NavigationView navigationView;

    private FloatingActionButton floatingActionButton;

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

    private void initView() {
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolBar);
        setSupportActionBar(toolbar);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);

        navigationView = (NavigationView) findViewById(R.id.navigation);

        // FloatingActionButton 悬浮按钮
        floatingActionButton = (FloatingActionButton) findViewById(R.id.fab);

        ActionBar actionBar = getSupportActionBar();
        if (actionBar != null) {
            actionBar.setDisplayHomeAsUpEnabled(true);
            actionBar.setHomeAsUpIndicator(R.mipmap.category);
        }

        navigationView.setCheckedItem(R.id.account);

        navigationItemSelected();

        floatingActionButton();
    }

    private void navigationItemSelected() {
        navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                mDrawerLayout.closeDrawers();

                //do something

                return true;
            }
        });
    }

    /**
     * FloatingActionButton 响应
     */
    private void floatingActionButton() {
        floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Toast.makeText(MainActivity.this, "FloatingActionButton", Toast.LENGTH_SHORT).show();
            }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.toolbar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {

            case R.id.backup:
                Toast.makeText(this, "Click Backup", Toast.LENGTH_LONG).show();
                break;
            case R.id.delete:
                Toast.makeText(this, "Click Delete", Toast.LENGTH_LONG).show();
                break;
            case R.id.setting:
                Toast.makeText(this, "Click Setting", Toast.LENGTH_LONG).show();
                break;

            case android.R.id.home:
                mDrawerLayout.openDrawer(Gravity.LEFT);
                break;
            default:
        }
        return true;
    }
}

       这里的代码也是挺清晰的,首先我们先初始化 FlaotingActionButton 控件,然后通过 setOnclickListener 来设置点击事件,这里是不是太熟悉了,是的,FlaotingActionButton 的点击事件的设置是和我们普通的 Button 一模一样,并没有什么特别之处,这里我们是点击按钮弹出一个吐司,大家可以根据业务的具体需要进行相应的功能实现


二、交互提示 Snackbar


       上面我们已经掌握了 FlaotingActionButton 的基本用法,现在我们来学习 Material Design 的另一个小工具 Snackbar,这里首先要明确 Snackbar 并不是 Toast 的替代品,应用场景是不一样的,Toast 只是一个提示作用,用户并不能进行操作,而 Snackbar 则不同,它允许在提示当中加入一个交互按钮,当用户点击的时候可以进行一写相应额逻辑操作,相应的提升了用户体验


修改 Activity 中的代码如下:

    /**
     * FloatingActionButton 响应
     */
    private void floatingActionButton() {
        floatingActionButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Snackbar.make(v, "data", Snackbar.LENGTH_SHORT).setAction("你好", new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //do something
                        Toast.makeText(MainActivity.this, "data", Toast.LENGTH_SHORT).show();
                    }
                }).show();
            }
        });
    }

       我们来进行简单的分析,这里调用了 Snackbar 的 make() 方法来创建一个 Snackbar 对象,make() 方法的第一个参数要出入一个View,Snackbar 会使用这个 View 来自动查找最外层的布局,用于展示 Snackbar,第二个参数是 Snackbar 中显示的内容,第三个参数是显示 Snackbar 的时间长短,这里和 Toast 设置时间的长短类似,接着调用 setAction() 方法来设置一个动作,从而让 Snackbar 不仅仅是一个提示,而是可以和用户进行交互,这个是最重要的,效果图如下:




       可以看到这里出现了一个不好的体验,就是 Snackbar 从底部弹出以后遮挡了 FlaotingActionButton 按钮,那么这个该如何解决呢,其实也很简单,就是通过 CoordinatorLayout 布局,我们具体来看一下,我们修改 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:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawerLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#c7c6c6">

    <android.support.design.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolBar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/colorPrimary"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:titleTextColor="#f5f0f0" />

        <android.support.design.widget.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_margin="18dp"
            android:elevation="20dp"
            android:src="@mipmap/pen"
            app:backgroundTint="#0882f4" />


    </android.support.design.widget.CoordinatorLayout>

这里我们把 FrameLayout 换成了 CoordinatorLayout 布局,我们再运行来看一下效果图:



   

        这里看到上面的问题就很好的解决了,是不是很神奇,CoordinatorLayout 其实就是一个加强版的 FrameLayout ,这个布局是由Material Design 库提供的,CoordinatorLayout 可以监听所有子控件的各种事件,然后做出最为合理的响应,例如我们刚才的使用,Snackbar 提示将悬浮按钮挡住了,而如果我们能够监听到 Sanckbar 的弹出事件,则把按钮向上偏移,从而确保 FlaotingActionButton不会被挡住,另外由于是加强版的 FrameLayout 大家可以放心使用,不会有任何的副作用,好了今天我们就介绍到这里,今天的内容不多,但确是一些实用的小技巧,希望大家可以掌握


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值