我有一个自定义布局的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执行水平填充首先然后然后移动到底部吗?我可以让视图从顶部而不是从底部垂直缩小吗?
回答部分评论:
更新
为了能够重现此问题,请使用上面的代码并在虚拟设备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.然后吐司不会在底部,但这是非常罕见的。
答案 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();