在屏幕底部放置带有自定义布局的Toast

时间:2017-12-16 00:06:55

标签: android android-layout android-toast

我有一个自定义布局的Toast,我想放在屏幕的底部,同时让它填满屏幕的宽度。我无法让它正常工作。

我的Toast布局toast.xml:

<?xml version="1.0" encoding="UTF-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ee222222"
    android:textColor="#ffffff" />

显示Toast,MyToast.java的代码:

View view = inflater.inflate(R.layout.toast, null);
TextView textView = phoneToastView.findViewById(R.id.text);
textView.setText("1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18");

Toast toast = new Toast(getContext());
toast.setGravity(Gravity.BOTTOM | Gravity.FILL_HORIZONTAL, 0, 0);
toast.setView(view);
toast.setDuration(Toast.LENGTH_LONG);
toast.show();

这是我的问题:

如果我将重力设置为BOTTOM,我会在屏幕底部看到Toast。如果我将重力设置为FILL_HORIZONTAL,它将水平填充屏幕。如果我同时使用它们,它会水平填充屏幕,但是Toast和屏幕底部之间存在间隙。

我认为会发生什么,是Android创建视图,将其移至底部,然后将其展开。现在文本突然有更多的空间,对于某些屏幕和一些文本意味着它从2行文本变为只有1行文本。

现在视图突然需要更少的垂直空间,并且通过向下移动底部边缘来缩小视图。

有解决方法吗?我可以强制Android执行水平填充首先然后然后移动到底部吗?我可以让视图从顶部而不是从底部垂直缩小吗?

回答部分评论:

  • 我不能使用Snackbar,因为当我的应用程序在后台时会显示此Toast
  • 我在Toast中显示的文字长度各不相同,所以我无法预测会有多少行文字
  • 上面的代码是我能够重现错误的绝对最简单的

更新

为了能够重现此问题,请使用上面的代码并在虚拟设备Nexus 5上运行该应用。

以下是包含三种不同长度文本的屏幕截图的链接。最短和最长的文本显示在底部,中间文本在Toast下面有一个间隙:

更新2:我的解决方案

我的新吐司布局toast.xml:

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ee222222"
    android:orientation="vertical">

    <TextView
        android:id="@+id/text1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:maxLines="1"
        android:textColor="#ffffff" />

    <TextView
        android:id="@+id/text2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:ellipsize="end"
        android:maxLines="1"
        android:textColor="#ffffff" />

    <TextView
        android:id="@+id/text3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxLines="3"
        android:ellipsize="end"
        android:textColor="#ffffff" />

</LinearLayout>

显示Toast,MyToast.java的新代码:

View view = inflater.inflate(R.layout.toast, null);

TextView textView1 = phoneToastView.findViewById(R.id.text1);
textView1.setText("Some text on one line");
TextView textView2 = phoneToastView.findViewById(R.id.text2);
textView2.setText("Some more text on one line");
TextView textView3 = phoneToastView.findViewById(R.id.text3);
textView3.setText("Even more text, and this text is much longer, not fitting on one line at all.");

// If I don't need the unpredictable third line of text, hide the view
textView3.setVisibility(View.GONE);

Toast toast = new Toast(getContext());
toast.setGravity(Gravity.BOTTOM | Gravity.FILL_HORIZONTAL, 0, 0);
toast.setView(view);
toast.setDuration(Toast.LENGTH_LONG);
toast.show();

根据我的需要,我将主要使用textviews 1和2.然后toast将位于屏幕的底部(因为它们被固定为有一行文本)。在某些情况下,我无法预测文本的长度,然后我使用textview 3.然后吐司不会在底部,但这是非常罕见的。

2 个答案:

答案 0 :(得分:0)

我一直找不到合适的答案,而是使用@ xenolion的建议作为解决方法。

我没有单一的文本视图,而是有4个文本视图,其中大多数固定为一行文本并隐藏了我不需要的文本视图。请参阅我更新的代码答案。

答案 1 :(得分:0)

  

如果将重力设置为BOTTOM,则将Toast放在屏幕底部。如果将重力设置为FILL_HORIZONTAL,它将水平填充屏幕。如果同时使用两者,则它将水平填满屏幕,但是Toast和屏幕底部之间会有一个缝隙。

我最近也遇到了这个问题。吐司设置了一些默认边距。幸运的是,消除这种差距的方法很简单:

Toast toast = new Toast(getContext());
toast.setGravity(Gravity.BOTTOM | Gravity.FILL_HORIZONTAL, 0, 0);
toast.setView(view);
toast.setDuration(Toast.LENGTH_LONG);

// remove the margins which cause the gap
toast.setMargin(0,0);
toast.show();