我只是从我的电话Activity
:
Toast.makeText(this, "This is a toast", Toast.LENGTH_SHORT).show()
但结果是在 toast 容器顶部对齐的文本,而不是应该在内部居中:
关于什么可能是错误的任何想法?
我只是从我的电话Activity
:
Toast.makeText(this, "This is a toast", Toast.LENGTH_SHORT).show()
但结果是在 toast 容器顶部对齐的文本,而不是应该在内部居中:
关于什么可能是错误的任何想法?
我设法修复它。问题在于将属性android:fitsSystemWindows
应用于活动的主题。我发现这个答案解释了为什么不应该这样做:
该
android:fitsSystemWindows
属性旨在用于布局 xml 中的视图,而不是主题。您所看到的是样式化属性系统在 Android 中的工作方式的效果。如果没有在视图元素上或在赋予视图的显式样式中指定属性,则框架会检查是否已在主题本身上指定了该属性。如果在那里找到,则使用该值。由于 toast 使用的视图使用您的活动主题,因此默认值 false 被覆盖,您会看到此行为。
您不仅通过在主题中指定它来更改顶级视图的 fitSystemWindows 默认值,而且还为具有该主题的所有视图覆盖它,这不是您想要的。您应该只在您的布局中的视图上或在您明确应用于布局中的视图的样式中指定 fitSystemWindows,而不是在主题上。
只需将属性应用到ViewGroup
活动的最顶部(或设置样式)而不是其主题,toast 将被正确格式化。
出现这种情况是因为在横屏状态下,导航栏的宽度也会被计算出来,不管导航栏是否隐藏,所以可以减去导航栏宽度的一半。
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;
}