Android 高级进阶(十一)SnackBar的使用

        Android系统从5.0开始引进了许多新的控件,它们给予了用户更好的体验,这些控件都遵循现在流行的Material Design设计原则。今天我们就来温故一下SnackBar控件,它是一种类似Android Toast(显示提示信息) 与 对话框的控件,经常用于给用户提示信息,比如“您还没有登录,请点击登录”.  SnackBar是介于Toast与对话框之间的产物,为什么这么说呢?我们来对比一下这3个控件:

  • Toast,它显示提示信息后,过几秒就会自动消失,与用户没有交互。不过,用户还可以点击主界面上的其它控件。
  •  对话框,它显示也提示信息,不过用户必须手动取消掉这个对话框之后才能与主界面交互。例如必须取消对话框,才能点击对话框下面的主界面上的按钮控件等。
  •  SnackBar,它类似于Toast提示信息,但是可以不用自动消失,而且还可以显示按钮,与用户交互,这一点类似于对话框,但是它又不同于对话框,当它停留在主界面之上的时候,用户无需取消它,仍然可以与主界面上的控件进行交互。

  通过以上描述我们发现SnackBar既能显示提示信息也能与用户交互,更重要的是它不妨碍我们操作主界面上的其它控件,它就是    介于Toast与对话框之间的产物。SnackBar的适用场景就是显示提示信息,它上边的交互按钮对用户来说不是必须操作的。Ok,接下来我们就详细介绍下SnackBar的用法及与Toast的对比。

1. 布局文件:

<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="match_parent"
    >

    <Button
        android:id="@+id/btToastShow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/textView1"
        android:layout_below="@+id/textView1"
        android:layout_marginTop="66dp"
        android:text="显示Toast到中间" />

    <Button
        android:layout_marginTop="30dp"
        android:layout_below="@+id/btToastShow"
        android:id="@+id/btSnackBarShow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Snackbar" />

</RelativeLayout>

  布局文件里放2个Button,点击第一个btToastShow用于显示Toast,点击第二个btSnackShow用于显示SnackBar以方便我们对比两者的用法。

 2. 代码:

MainActivity.java

package com.anyikang.volunteer.sos.snackbar;

import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.design.widget.Snackbar.Callback;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements OnClickListener{
	Button btToastShow;
	Button btSnackBarShow;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		//Toast显示
		btToastShow = this.findViewById(R.id.btToastShow);
		btToastShow.setOnClickListener(this);

		//SnackBar显示提示信息
		btSnackBarShow = this.findViewById(R.id.btSnackBarShow);
		btSnackBarShow.setOnClickListener(this);
	}

	@Override
	public void onClick(View view) {
		switch (view.getId())
		{
			case R.id.btToastShow:
				showCenterToast();
				break;
			case R.id.btSnackBarShow:
				showSnackbar(view);
				break;
		}
	}

	/**
	 * 显示自定义Toast提示信息到屏幕中央
	 */
	public void showCenterToast(){
		Toast centerToast = new Toast(this);
        LayoutInflater inflate = 
             (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflate.inflate(R.layout.center_toast, null);
        TextView tv = (TextView)view.findViewById(R.id.textView1);
        tv.setText("Hello 小伟");
		centerToast.setGravity(Gravity.CENTER, 0, 0);
		centerToast.setView(view);
		centerToast.setDuration(Toast.LENGTH_LONG);
		centerToast.show();
	}

	/**
	 * 显示SnackBar
	 */
	public void showSnackbar(View v){
		Snackbar snackbar = Snackbar.make(v, "请点击登录", Snackbar.LENGTH_INDEFINITE);
		snackbar.setAction("取消", new OnClickListener() {
			@Override
			public void onClick(View v) {
				//gxw- showCenterToast();
			}
		});

		snackbar.setAction("登录", new OnClickListener() {
			@Override
			public void onClick(View v) {
				showCenterToast();
			}
		});

		snackbar.setCallback(new Callback() {
			@Override
			public void onDismissed(Snackbar snackbar, int event) {
				Log.i("snackbar","SnackBar已消失");
				super.onDismissed(snackbar, event);
			}
			
			@Override
			public void onShown(Snackbar snackbar) {
				Log.i("snackbar","SnackBar已显示");
				super.onShown(snackbar);
			}
		});
		snackbar.setActionTextColor(Color.RED);
		snackbar.show();
	}

}

代码分析  

1. showCenterToast

showCenterToast用于显示自定义Toast,在这里我们为Toast自定义了一个布局R.layout.center_toast,同时使用这行代码:centerToast.setGravity(Gravity.CENTER, 0, 0);将Toast显示在屏幕中央。

2. showSnackBar

  • 创建SnackBar

Snackbar snackbar = Snackbar.make(v, "请点击登录", Snackbar.LENGTH_INDEFINITE);这行代码创建了一个SnakeBar,需要3个参数:

(1)View v: 参数view可以随便提供一个VIEW控件的实例,如传入btSnackBarShow,这个与popupwindow比较类似都需要一个锚点,不过这里传递view是为了找到view的parent view,其实最终找到btSnackBarShow的parentview为整个窗体。这也是SnackBar能像对话框一样覆盖在整个主界面之上的原因。

(2)提示信息

(3)显示时间,这里我们设置为Snackbar.LENGTH_INDEFINITE,即不让它自动消失,我们通过手动点击SnackBar上面的按钮让它消失。当然,我们也可以设置成与Toast一样,让它显示一会儿自动消失。

  • 定义SnackBar上的交互按钮
    snackbar.setAction("取消", new OnClickListener() {
            @Override
            public void onClick(View v) {
                //gxw- showCenterToast();
            }
        });

        snackbar.setAction("登录", new OnClickListener() {
            @Override
            public void onClick(View v) {
                showCenterToast();
            }
        });

   这里我们连续定义了2个action交互按钮,其实起效的只有一个就是后来的“登录”按钮,在此为了告诉大家SnackBar上只能有一    个交互按钮,如果定义多个后者会覆盖前面的按钮。

  • 显示SnackBar:设置交互按钮的颜色与显示SnackBar    
  snackbar.setActionTextColor(Color.RED);
  snackbar.show();
扫描二维码关注公众号,回复: 3488650 查看本文章
  • SnackBar的显示与隐藏的监听
	snackbar.setCallback(new Callback() {
			@Override
			public void onDismissed(Snackbar snackbar, int event) {
				Log.i("snackbar","SnackBar已消失");
				super.onDismissed(snackbar, event);
			}
			
			@Override
			public void onShown(Snackbar snackbar) {
				Log.i("snackbar","SnackBar已显示");
				super.onShown(snackbar);
			}
		});

当点击SnackBar上的Action交互按钮时SnackBar会消失,这时会回调onDismissed函数。同理,显示SnackBar时会回调onShown函数。

显示效果如图如下:

源码下载:https://download.csdn.net/download/gaoxiaoweiandy/10675098

猜你喜欢

转载自blog.csdn.net/gaoxiaoweiandy/article/details/82717202