本帖最后由 大蓝鲸小蟀锅 于 2018-12-25 11:27 编辑
toast,正常给用户的一个提示,用户可以不去理会,不会去中断用户的操作。只是告诉用户有一件事情发生了,过段时间就消失,不会对用户有任何影响。使用方法,个人感觉还是封装一下,使用起来会很方便。
private static Toast toast;
public static void showToast(Context context,String string,boolean flag){
if (toast == null){
if (flag){
toast = Toast.makeText(context,string,Toast.LENGTH_SHORT);
}else {
toast = Toast.makeText(context,string,Toast.LENGTH_LONG);
}
}else {
toast.setText(string);
}
toast.show();
}
那个flag是用来判断Toast存在的时间的,需要长时间还是短时间。
Dialog,谷歌给我们提供了很多默认的Dialog,单选,多选,确认等等,但是平时使用最多的应该还是自定义的,就是把系统的Dialog的style设置为透明的,然后自己写一个类继承dialog,自己添加一个layout,自己写逻辑就可以完成了。
使用起来也是很方便,但是dialog弹出的时候会中断用户的操作,如果是一些无关紧要的提示,最好不要使用dialog,比如你正在玩游戏,有个无关的提示打断了你,是不是会很火,大家都是一样的。所以使用起来还是应该谨慎一点。
本来想封装的,但是dialog一定需要绑定activity,所以gg。
SnackBar,是从底部弹出来,可以和用户交互的一个弹窗。运行在屏幕其他元素之上(屏幕最上层),同一时间只能显示一个snackbar
在使用Snackbar之前,首先需要在app/build.gradle中添加相应的依赖:
dependencies {
compile 'com.android.support:design:23.4.0'
}
然后就可以使用Snackbar了,它的用法和Toast是比较相似的:
Snackbar.make(view, "data deleted",Snackbar.LENGTH_LONG)
.setAction("Undo", new View.OnClickListener(){
@Override
public void onClick(View v) {
}
})
.show();
这里调用Snackbar的make()方法来创建一个Snackbar对象,make()方法的第一个参数需要传入一个view,只要是当前界面 布局的任意一个view都可以,
补充: 这里说的view很简单,什么View都可以,但你使用的时候懵逼了,我应该用哪个,怎么使用,真的不知道,到csdn中找到一篇文章,很棒,完美的解决了我的问题,感谢大神,我就把你代码拿过来了,O(∩_∩)O哈哈~
我们知道一个布局的最最最最外层有一个DecorView,而这个view就是我们通用的view.
在activity中我们这样获取DecorView:getwindow().getDecorView();就得到了这个最外层的view.
一旦得到这个view,Snackbar的显示就简单的跟1一样.代码如下:
/**
* 展示一个SnackBar
*/
public void showSnackBar(String message) {
final Snackbar snackbar = Snackbar.make(getWindow().getDecorView(), message, Snackbar.LENGTH_INDEFINITE);
snackbar.setAction("知道了", new View.OnClickListener() {
@Override
public void onClick(View v) {
snackbar.dismiss();
}
}).show();
}
很棒,直接拿到最外层的view,不用考虑到底用哪一个布局了,直接解放自己, setAction可以不写,不设置,右边就没有效果。
上面这行代码在没有虚拟键的屏幕上使用起来很棒,但是现在很多手机都有虚拟按键,弹出来的snackBar会被虚拟按钮挡住,会没有效果。
这个时候有两个办法 :
1.让snackbar高一点,正好超过虚拟按钮的高度,获得虚拟按钮的高度
/**
* 获取屏幕原始尺寸高度,包括虚拟功能键高度
*/
public static int getRawScreenHeight(Context context) {
int dpi = 0;
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics displayMetrics = new DisplayMetrics();
@SuppressWarnings("rawtypes")
Class c;
try {
c = Class.forName("android.view.Display");
@SuppressWarnings("unchecked")
Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
method.invoke(display, displayMetrics);
dpi = displayMetrics.heightPixels;
} catch (Exception e) {
e.printStackTrace();
}
return dpi;
}
/**
* 获取屏幕高度
*
* @return 返回当前屏幕高度
*/
public static int getScreenHeight(Context context) {
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(metrics);
return metrics.heightPixels;
}
/**
* 获取虚拟按键栏的高度(有虚拟按键栏时有值,没有虚拟按键栏时返回0)
*/
public static int getBottomStatusHeight(Context context) {
int totalHeight = getRawScreenHeight(context);
int contentHeight = getScreenHeight(context);
return totalHeight - contentHeight;
}
2.把虚拟按钮隐藏,显示结束后,在显示虚拟按钮。
/**
* 展示一个SnackBar
*/
public void showSnackBar(String message) {
//去掉虚拟按键
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION //隐藏虚拟按键栏
| View.SYSTEM_UI_FLAG_IMMERSIVE //防止点击屏幕时,隐藏虚拟按键栏又弹了出来
);
final Snackbar snackbar = Snackbar.make(getWindow().getDecorView(), message, Snackbar.LENGTH_INDEFINITE);
snackbar.setAction("知道了", new View.OnClickListener() {
@Override
public void onClick(View v) {
snackbar.dismiss();
//隐藏SnackBar时记得恢复隐藏虚拟按键栏,不然屏幕底部会多出一块空白布局出来,和难看
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
}
}).show();
}
SnackBar后面还有一个CallBack() 你可以通过这个接口,具体的知道 snackBar是怎么隐藏的,超时隐藏,还是点击隐藏等等, 还可以在隐藏的时候做一些操作。
Snackbar会使用这个view来自动查找最外层的布局,用于展示Snackbar。第二个参数就是Snackbar 中显示的内容,第三个参数是Snackbar显示的时长。这些和Toast都是类似的。 效果图。
正常如果使用snackBar可以改变背景,改变字体颜色,等等自定义属性,但是也不要弄得太花哨,提示太花哨也不好看,snackBar系统提供的布局是一个继承LinearLayout的snackBar,我们可以
创建一个布局,添加到snackBar中就Ok了,为了使用方便,可以像Toast一样,封装一个使用类,感谢赵大神,我这边测试添加图片,添加的布局叠加起来了,不想是LinearLayout,反而像是Framlayout,但看源码那边是LinearLayout,具体怎么回事还每明白。 标记: 高版本的SDK , snackBar中的布局换成了FramLayout,如果要添加view,需要修改一下。
/**
* Created by 赵晨璞 on 2016/5/1.
*/
public class SnackbarUtil {
public static final int Info = 1;
public static final int Confirm = 2;
public static final int Warning = 3;
public static final int Alert = 4;
public static int red = 0xfff44336;
public static int green = 0xff4caf50;
public static int blue = 0xff2195f3;
public static int orange = 0xffffc107;
/**
* 短显示Snackbar,自定义颜色
* @param view
* @param message
* @param messageColor
* @param backgroundColor
* @return
*/
public static Snackbar ShortSnackbar(View view, String message, int messageColor, int backgroundColor){
Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_SHORT);
setSnackbarColor(snackbar,messageColor,backgroundColor);
return snackbar;
}
/**
* 长显示Snackbar,自定义颜色
* @param view
* @param message
* @param messageColor
* @param backgroundColor
* @return
*/
public static Snackbar LongSnackbar(View view, String message, int messageColor, int backgroundColor){
Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_LONG);
setSnackbarColor(snackbar,messageColor,backgroundColor);
return snackbar;
}
/**
* 自定义时常显示Snackbar,自定义颜色
* @param view
* @param message
* @param messageColor
* @param backgroundColor
* @return
*/
public static Snackbar IndefiniteSnackbar(View view, String message,int duration,int messageColor, int backgroundColor){
Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_INDEFINITE).setDuration(duration);
setSnackbarColor(snackbar,messageColor,backgroundColor);
return snackbar;
}
/**
* 短显示Snackbar,可选预设类型
* @param view
* @param message
* @param type
* @return
*/
public static Snackbar ShortSnackbar(View view, String message, int type){
Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_SHORT);
switchType(snackbar,type);
return snackbar;
}
/**
* 长显示Snackbar,可选预设类型
* @param view
* @param message
* @param type
* @return
*/
public static Snackbar LongSnackbar(View view, String message,int type){
Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_LONG);
switchType(snackbar,type);
return snackbar;
}
/**
* 自定义时常显示Snackbar,可选预设类型
* @param view
* @param message
* @param type
* @return
*/
public static Snackbar IndefiniteSnackbar(View view, String message,int duration,int type){
Snackbar snackbar = Snackbar.make(view,message, Snackbar.LENGTH_INDEFINITE).setDuration(duration);
switchType(snackbar,type);
return snackbar;
}
//选择预设类型
private static void switchType(Snackbar snackbar,int type){
switch (type){
case Info:
setSnackbarColor(snackbar,blue);
break;
case Confirm:
setSnackbarColor(snackbar,green);
break;
case Warning:
setSnackbarColor(snackbar,orange);
break;
case Alert:
setSnackbarColor(snackbar,Color.YELLOW,red);
break;
}
}
/**
* 设置Snackbar背景颜色
* @param snackbar
* @param backgroundColor
*/
public static void setSnackbarColor(Snackbar snackbar, int backgroundColor) {
View view = snackbar.getView();
if(view!=null){
view.setBackgroundColor(backgroundColor);
}
}
/**
* 设置Snackbar文字和背景颜色
* @param snackbar
* @param messageColor
* @param backgroundColor
*/
public static void setSnackbarColor(Snackbar snackbar, int messageColor, int backgroundColor) {
View view = snackbar.getView();
if(view!=null){
view.setBackgroundColor(backgroundColor);
((TextView) view.findViewById(R.id.snackbar_text)).setTextColor(messageColor);
}
}
/**
* 向Snackbar中添加view
* @param snackbar
* @param layoutId
* @param index 新加布局在Snackbar中的位置
*/
public static void SnackbarAddView( Snackbar snackbar,int layoutId,int index) {
View snackbarview = snackbar.getView();
Snackbar.SnackbarLayout snackbarLayout=(Snackbar.SnackbarLayout)snackbarview;
View add_view = LayoutInflater.from(snackbarview.getContext()).inflate(layoutId,null);
LinearLayout.LayoutParams p = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
p.gravity= Gravity.CENTER_VERTICAL;
snackbarLayout.addView(add_view,index,p);
}
}
Dialog:当提示信息是至关重要的,并且必须要由用户做出决定才能继续的时候,使用Dialog。
Toast:当提示信息只是告知用户某个事情发生了,用户不需要对这个事情做出响应的时候,使用Toast。
Snackbar:以上两者之外的任何其他场景,Snackbar可能会是你最好的选择。
/**
* 获取屏幕原始尺寸高度,包括虚拟功能键高度
*/
public static int getRawScreenHeight(Context context) {
int dpi = 0;
WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = windowManager.getDefaultDisplay();
DisplayMetrics displayMetrics = new DisplayMetrics();
@SuppressWarnings("rawtypes")
Class c;
try {
c = Class.forName("android.view.Display");
@SuppressWarnings("unchecked")
Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);
method.invoke(display, displayMetrics);
dpi = displayMetrics.heightPixels;
} catch (Exception e) {
e.printStackTrace();
}
return dpi;
}
/**
* 获取屏幕高度
*
* @return 返回当前屏幕高度
*/
public static int getScreenHeight(Context context) {
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
manager.getDefaultDisplay().getMetrics(metrics);
return metrics.heightPixels;
}
/**
* 获取虚拟按键栏的高度(有虚拟按键栏时有值,没有虚拟按键栏时返回0)
*/
public static int getBottomStatusHeight(Context context) {
int totalHeight = getRawScreenHeight(context);
int contentHeight = getScreenHeight(context);
return totalHeight - contentHeight;
} |
|