A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 大蓝鲸小蟀锅 于 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;  
   }  

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马