请先阅读问题,然后再使用打印 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,toast 的位置不是 (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 在这些设备上添加了这个边距。看起来像是一个安全区域或类似的东西,但我找不到在哪里(或是否)可以更改它。
帮助表示赞赏。