如何让Toast全屏且显示在屏幕顶部 ?

一. 非常简单, 给Toast同时设置两个Gravity值就可以了, 即同时设置Gravity.TOP (顶部对齐) 和 Gravity.FILL_HORIZONTAL (宽度全屏), 请看代码:

private void toast() {
    // 兼容所有机型
    Toast t = new Toast(this);
    t.setDuration(Toast.LENGTH_LONG);
    t.setGravity(Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, getActionBarHeight());
    t.setView(createContentView("已将视频保持到本地"));
    t.show();

    /** 
    // 某些机型toast有圆角
    Toast t = Toast.makeText(this, "已将视频保持到本地", Toast.LENGTH_LONG);
    t.setGravity(Gravity.TOP | Gravity.FILL_HORIZONTAL, 0, getActionBarHeight());
    t.show();
    */
}

@NonNull
private TextView createContentView(String msg) {
    TextView tv = new TextView(this);
    //下面这句不能少, 否则将没有任何东西显示
    tv.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
    tv.setText(msg);
    tv.setGravity(Gravity.CENTER);
    int padding = (int) UIUtils.dip2px(this, 12);
    tv.setPadding(padding, padding, padding, padding);
    tv.setBackgroundColor(Color.parseColor("#88000000"));
    tv.setTextColor(Color.WHITE);
    return tv;
}

//获取ActionBar的高度
private int getActionBarHeight() {
    TypedValue tv = new TypedValue();
    if(getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
        return TypedValue.complexToDimensionPixelOffset(tv.data, getResources().getDisplayMetrics());
    } else {
        //获取不到系统属性, 设置一个默认高度
        return (int)UIUtils.dip2px(this, 48);
    }
}

需要注意的是 (代码中已经说明, toast()方法中注释部分是使用系统API创建Toast, 未注释的是自己创建Toast的内容View) , 如果直接用系统方法创建Toast (Toast.makeText()), 在某些机型上会有一个圆角效果, 非常丑, 如下图:

如何让Toast全屏且显示在屏幕顶部 ?_第1张图片
顶部全屏Toast(有圆角).png

因此, 为了在所有机型上展示的效果一致, 最好是自己创建一个TextView, 然后设置给Toast, 效果如下:


如何让Toast全屏且显示在屏幕顶部 ?_第2张图片
适配所有机型的顶部全屏Toast.png

你可能感兴趣的:(如何让Toast全屏且显示在屏幕顶部 ?)