Android高级UI开发(十一)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();
- 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,作者:冉航--小虾米,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/gaoxiaoweiandy/article/details/82717202
- 点赞
- 收藏
- 关注作者
评论(0)