请在回答您的标准例程之前阅读问题以打印Toast:)
我想在屏幕的左上角显示自定义Toast。我使用此代码创建Toast:
Toast mFixedToast = new Toast(getApplicationContext());
mFixedToast.setDuration(timeout);
mFixedToast.setView(myInflatedLayout);
mFixedToast.setGravity(Gravity.TOP|Gravity.FILL_HORIZONTAL, 0, 0);
mFixedToast.setMargins(0,0);
但是,在某些设备中 ,例如三星Galaxy S4,吐司不是位于(0,0),而是有40-50像素的边距。 许多其他设备按预期工作。
我很肯定WindowManager添加了边距(Toast视图作为TYPE_TOAST类型的视图添加到WindowManager中)
为什么?可以修改吗?请看下面的代码,我已经将Toast.java克隆到我自己的类中并隔离了将视图添加到WM的行:
// LayoutParams for the TOAST view ... tried to change params.type but no luck.
final WindowManager.LayoutParams params = mParams;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
params.format = PixelFormat.TRANSLUCENT;
params.windowAnimations = android.R.style.Animation_Toast;
params.type = WindowManager.LayoutParams.TYPE_TOAST;
mWM = (WindowManager)mView.getContext().getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
mParams.gravity = gravity;
// CHECKED these all are 0 !!!
mParams.x = mX; mParams.y = mY;
mParams.verticalMargin = mVerticalMargin;
mParams.horizontalMargin = mHorizontalMargin;
.
.
if (localLOGV) Log.v(TAG, "ADD! " + mView + " in " + this+" with "+mX+","+mY+","+mVerticalMargin+","+mHorizontalMargin);
mWM.addView(mView, mParams);
所以看起来是WindowManager在这些设备上添加这个边距。看起来像一个安全的区域或类似的东西,但我无法找到(或如果)这可以改变。
帮助表示赞赏。
答案 0 :(得分:3)
我想出来了。
从4.4+开始,你必须添加以下标志:
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) {
mParams.flags = mParams.flags | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
}
这样可以让你的吐司一直定位到顶部。
答案 1 :(得分:1)
请尝试以下方法:
mFixedToast.setGravity(Gravity.TOP, 0, 0);
同时检查可能导致问题的膨胀布局。您可能正在将MatchParent用于该视图和重心。
答案 2 :(得分:0)
private void Toast(String string) {
// TODO Auto-generated method stub
LinearLayout layout = new LinearLayout(this);
layout.setBackgroundResource(R.color.Orange);
TextView tv = new TextView(this);
tv.setTextColor(Color.YELLOW);
tv.setTextSize(25);
tv.setGravity(Gravity.Top);
tv.setText(string);
ImageView img = new ImageView(this);
img.setImageResource(R.drawable.ic_launcher2);
layout.addView(img);
layout.addView(tv);
Toast toast = new Toast(this); // context is object of Context write
tts.speak(string, TextToSpeech.QUEUE_FLUSH, null); // "this" if you are
// an Activity
toast.setView(layout);
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.show();
}
答案 3 :(得分:0)
您可以尝试使用此方法在屏幕中央显示吐司。如果您想在顶部显示吐司。您可以更改msg.getYOffset()
。
这是代码。试试这个
public static void displyToast(Context c, String str) {
Toast msg = Toast.makeText(c, str, Toast.LENGTH_SHORT);
msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2,
msg.getYOffset() / 2);
msg.show();
}
msg.getXOffset() / 2 take toast on center of screen horizintallly, whereas `msg.getYOffset() / 2` takes toast on center of screen vertically.
我希望这会对你有所帮助。 快乐编码:)