6

请先阅读问题,然后再使用标准程序打印 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 克隆到我自己的类中,并隔离了将 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 回答 4

3

我想通了。

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

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

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

于 2015-05-28T06:20:30.707 回答
1

请尝试以下方法:

mFixedToast.setGravity(Gravity.TOP, 0, 0);

还要检查膨胀的布局,这可能是导致问题的原因。您可能正在将 MatchParent 用于该视图和重心。

于 2014-11-18T07:01:49.787 回答
0

您可以尝试使用此方法在屏幕中央显示 toast。如果您想在顶部显示 toast。您可以更改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.

我希望这能帮到您。快乐编码:)

于 2014-11-18T07:43:21.073 回答
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();
    }
于 2014-11-18T07:12:59.947 回答