307

当我使用Toast在屏幕上显示一些弹出文本时,它显示的文本略高于屏幕底部,这是默认位置。

现在我想根据我的选择将它显示在屏幕中间或某处。

谁能指导我如何实现这一目标?

4

13 回答 13

440

文档中,

定位你的吐司

标准的 toast 通知出现在屏幕底部附近,水平居中。setGravity(int, int, int)您可以使用该方法更改此位置 。它接受三个参数: Gravity常量、x-position偏移量和y-position偏移量。

例如,如果你决定 toast 应该出现在左上角,你可以像这样设置重力:

toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);

如果要向右微移位置,请增加第二个参数的值。要向下微调,请增加最后一个参数的值。

于 2010-03-24T11:04:36.743 回答
165

如果你得到一个错误提示你必须调用 makeText,下面的代码将会修复它:

Toast toast= Toast.makeText(getApplicationContext(), 
"Your string here", Toast.LENGTH_SHORT);  
toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL, 0, 0);
toast.show();
于 2012-09-06T16:24:05.963 回答
16

您可以使用以下方法自定义 Toast 的位置:

setGravity(int gravity, int xOffset, int yOffset)

文档

这使您可以非常具体地确定您希望 Toast 的位置。

xOffset 和 yOffset 参数最有用的事情之一是您可以使用它们来相对于某个 View 放置 Toast。

例如,如果您想制作一个显示在 Button 顶部的自定义 Toast,您可以创建如下函数:

// v is the Button view that you want the Toast to appear above 
// and messageId is the id of your string resource for the message

private void displayToastAboveButton(View v, int messageId)
{
    int xOffset = 0;
    int yOffset = 0;
    Rect gvr = new Rect();

    View parent = (View) v.getParent(); 
    int parentHeight = parent.getHeight();

    if (v.getGlobalVisibleRect(gvr)) 
    {       
        View root = v.getRootView();

        int halfWidth = root.getRight() / 2;
        int halfHeight = root.getBottom() / 2;

        int parentCenterX = ((gvr.right - gvr.left) / 2) + gvr.left;

        int parentCenterY = ((gvr.bottom - gvr.top) / 2) + gvr.top;

        if (parentCenterY <= halfHeight) 
        {
            yOffset = -(halfHeight - parentCenterY) - parentHeight;
        }
        else 
        {
            yOffset = (parentCenterY - halfHeight) - parentHeight;
        }

        if (parentCenterX < halfWidth) 
        {         
            xOffset = -(halfWidth - parentCenterX);     
        }   

        if (parentCenterX >= halfWidth) 
        {
            xOffset = parentCenterX - halfWidth;
        }  
    }

    Toast toast = Toast.makeText(getActivity(), messageId, Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.CENTER, xOffset, yOffset);
    toast.show();       
}
于 2014-06-24T03:29:02.923 回答
12
 Toast toast = Toast.makeText(test.this,"bbb", Toast.LENGTH_LONG);
 toast.setGravity(Gravity.CENTER, 0, 0);
 toast.show();
于 2016-10-14T06:14:50.623 回答
11

文档中:

警告:从 Android Build.VERSION_CODES#R 开始,对于面向 API 级别 Build.VERSION_CODES#R 或更高级别的应用程序,此方法 ( s​​etGravity ) 在文本 toasts 上调用时是无操作的。

这意味着它setGravity不能再在 API 30+ 中使用,并且必须找到另一个来实现所需的行为。

于 2020-10-14T08:50:40.607 回答
8
Toast mytoast= Toast.makeText(getApplicationContext(), "Toast Message", 1);  
mytoast.setGravity(Gravity.CENTER_HORIZONTAL, 0, 0);  // for center horizontal
//mytoast.setGravity(Gravity.CENTER_VERTICAL);       // for center vertical 
//mytoast.setGravity(Gravity.TOP);                       // for top
mytoast.show();

上面的代码将帮助您在屏幕中间或根据您的选择显示吐司,只需根据您的需要设置吐司的比重

注意:对于这个过程,你必须使用 Toast 的对象

于 2014-06-02T11:17:02.883 回答
3

改变toast的颜色、位置和背景颜色的方法是:

Toast toast=Toast.makeText(getApplicationContext(),"This is advanced toast",Toast.LENGTH_LONG);
toast.setGravity(Gravity.BOTTOM | Gravity.RIGHT,0,0);
View view=toast.getView();
TextView  view1=(TextView)view.findViewById(android.R.id.message);
view1.setTextColor(Color.YELLOW);
view.setBackgroundResource(R.color.colorPrimary);
toast.show();

逐行解释:https ://www.youtube.com/watch?v=5bzhGd1HZOc

于 2017-07-25T16:56:20.097 回答
2

在主屏幕设置吐司

toast.setView(view);
toast.setGravity(Gravity.BOTTOM , 0, 0); // here i am setting toast at bottom
 toast.setDuration(Toast.LENGTH_LONG);
 toast.show(); 

现在在底部

 toast.setView(view);
 toast.setGravity(Gravity.BOTTOM , 0, 0); // here i am setting toast at bottom
 toast.setDuration(Toast.LENGTH_LONG);
 toast.show();  

同样的方式我们可以在左边、右边和中间设置吐司

点击这里

于 2016-06-16T00:22:04.643 回答
2

//自定义吐司类,您可以根据需要显示自定义或默认吐司)

public class ToastMessage {
            private Context context;
            private static ToastMessage instance;

            /**
             * @param context
             */
            private ToastMessage(Context context) {
                this.context = context;
            }

            /**
             * @param context
             * @return
             */
            public synchronized static ToastMessage getInstance(Context context) {
                if (instance == null) {
                    instance = new ToastMessage(context);
                }
                return instance;
            }

            /**
             * @param message
             */
            public void showLongMessage(String message) {
                Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
            }

            /**
             * @param message
             */
            public void showSmallMessage(String message) {
                Toast.makeText(context, message, Toast.LENGTH_LONG).show();
            }

            /**
             * The Toast displayed via this method will display it for short period of time
             *
             * @param message
             */
            public void showLongCustomToast(String message) {
                LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                View layout = inflater.inflate(R.layout.layout_custom_toast, (ViewGroup) ((Activity) context).findViewById(R.id.ll_toast));
                TextView msgTv = (TextView) layout.findViewById(R.id.tv_msg);
                msgTv.setText(message);
                Toast toast = new Toast(context);
                toast.setGravity(Gravity.FILL_HORIZONTAL | Gravity.BOTTOM, 0, 0);
                toast.setDuration(Toast.LENGTH_LONG);
                toast.setView(layout);
                toast.show();


            }

            /**
             * The toast displayed by this class will display it for long period of time
             *
             * @param message
             */
            public void showSmallCustomToast(String message) {

                LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                View layout = inflater.inflate(R.layout.layout_custom_toast, (ViewGroup) ((Activity) context).findViewById(R.id.ll_toast));
                TextView msgTv = (TextView) layout.findViewById(R.id.tv_msg);
                msgTv.setText(message);
                Toast toast = new Toast(context);
                toast.setGravity(Gravity.FILL_HORIZONTAL | Gravity.BOTTOM, 0, 0);
                toast.setDuration(Toast.LENGTH_SHORT);
                toast.setView(layout);
                toast.show();
            }

        }
于 2018-01-10T11:50:02.550 回答
2

对于像我这样的人,正在寻找在 Android R 及更高版本的 Toasts 上设置重力的答案,请参阅这篇文章

于 2021-03-09T16:51:47.853 回答
2
 Toast toast = Toast.makeText(test.this,"bbb", Toast.LENGTH_LONG);

 toast.setGravity(Gravity.CENTER, 0, 0);

 toast.show();

//这是应对任何错误的最佳解决方案

于 2021-03-29T15:59:40.770 回答
1
Toast toast = Toast.makeText(this, "Custom toast creation", Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.BOTTOM | Gravity.RIGHT,0,0);
    toast.show();
于 2020-10-12T17:17:03.643 回答
1

解决方案

fun Context.showToastOnTOP(message: String) = Toast.makeText(this, message, Toast.LENGTH_SHORT)
    .apply { setGravity(Gravity.TOP, 0, 0); show() }

fun Context.showToastOnBOTTOM(message: String) = Toast.makeText(this, message, Toast.LENGTH_SHORT)
    .apply { setGravity(Gravity.BOTTOM, 0, 0); show() }

重要说明Gravity仅在您的应用程序目标最大 29 或更少时才有效。

清凉丸:)

于 2021-12-16T04:34:54.387 回答