我只是来自我的Activity
:
Toast.makeText(this, "This is a toast", Toast.LENGTH_SHORT).show()
但是结果是在toast容器顶部对齐的文本,没有像它应该的那样居中:
关于什么可能出错的任何想法?
答案 0 :(得分:31)
我设法解决了这个问题。问题在于将属性android:fitsSystemWindows
应用于活动的主题。我发现this answer解释了为什么不应该这样做:
android:fitsSystemWindows
属性适用于布局xml中的视图,而不是主题。您所看到的是样式属性的效果 系统适用于Android。如果视图上未指定任何属性 元素或以给定视图的显式样式,框架 检查是否已在主题上指定该属性 本身。如果在那里找到,则使用该值。由于使用的意见 通过toasts使用您的活动的主题,默认值为false 被覆盖,你会看到这种行为。
您不只是更改了适合您的fitsSystemWindows默认设置 通过在主题中指定顶级视图,您将覆盖它 对于具有该主题的所有视图,这不是您想要的。你应该 仅在布局或中的视图上指定fitsSystemWindows 您明确应用于布局中的视图的样式,而不是 主题。
只需将该属性应用于活动的最顶层ViewGroup
(或样式),而不是其主题,并且烤面包将被正确格式化。
答案 1 :(得分:0)
之所以会发生这种情况,是因为在水平屏幕状态下,无论是否隐藏了导航栏,导航栏的宽度都会被计算出来,因此您可以减去导航栏宽度的一半。
toast.setGravity(Gravity.CENTER, getNavigationBarHeight() / 2, 0);
private int getNavigationBarHeight() {
Resources resources = this.getResources();
int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
return resources.getDimensionPixelSize(resourceId);
}
return 0;
}