一. 非常简单, 给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()
), 在某些机型上会有一个圆角效果, 非常丑, 如下图:
因此, 为了在所有机型上展示的效果一致, 最好是自己创建一个TextView, 然后设置给Toast, 效果如下: