android - 屏幕顶部的自定义 toast

标签 android layoutparams android-toast customizing

请先阅读问题,然后再使用您的标准例程打印 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);

但是,在某些设备中,例如 Samsung Galaxy S4,toast 不是位于 (0,0),而是有 40-50 像素的边距。 许多其他设备按预期工作。

我肯定边距是由 WindowManager 添加的( toast View 作为 TYPE_TOAST 类型的 View 添加到 WindowManager)

这是为什么?可以修改吗?请看下面的代码,我已经将 Toast.java 克隆到我自己的类中并隔离了将 View 添加到 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 在这些设备上添加了这个边距。看起来像一个安全区域或类似的东西,但我找不到在哪里(或是否)可以更改。

感谢帮助。

最佳答案

我想通了。

从 4.4+ 开始,您必须添加以下标志:

if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) {
        mParams.flags = mParams.flags | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
}

这将使您的 toast 一直定位到顶部。

关于android - 屏幕顶部的自定义 toast ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26988334/

相关文章:

android - android 股票浏览器上的 flexbox

android - 在android中以编程方式设置边距?

android - RelativeLayout 上面的 LayoutParams

android-layout - 导入什么来解决 "LayoutParams cannot be resolved to a variable"?

android - 在 Activity 出现之前使用应用程序上下文显示 toast

android - 单元测试时来自 Toast 的 NullPointerException

android - Firebase 作业调度程序是否需要互联网访问来安排作业?

android - 实现 retryWhen 逻辑

android - 如何将 asynctask onpostexecute 方法的结果传递给父 Activity android

android - Toast 消息不会出现在 android studio phonegap 中