为什么片段在显示键盘时调整大小时会在顶部和底部填充?
Why does the fragment get padding on top and bottom when it resizes when the keyboard is shown?
我有一个 activity 包含一个片段和其他几个片段。
这个 activity 已经有 fitsSystemWindows=false
,所以它会将它的边界扩展到屏幕的最底部,顺便说一句,我隐藏了导航栏。
问题是,它有一个片段,其中有一个 RichEditor 视图,这意味着用户应该能够在该片段中放置多行文本。所以我制作了片段 fitsSystemWindows=true
以便当用户开始单击 RichEditor 和类型时,我在样式中设置的 adjustResize
标志将启动并允许用户滚动页面。
它会调整大小并允许用户滚动是。
唯一的问题是,当片段调整大小时,它会在顶部和底部获得额外的填充,并且由于我在主 activity 上有一个自定义工具栏,所以在屏幕上添加它非常笨拙。有趣的是,top padding 和设备状态栏的高度完全一样,bottom padding 和导航栏的高度完全一样。
我尝试将片段布局中的 clipToPadding
属性设置为 true 和 false,但它不会阻止片段获取额外的填充。我也四处搜索,但我找不到任何有用的方法来解决这个问题,因为我遇到的大多数问题都是关于如何允许调整大小发生的,而不是关于如何删除或停止填充的任何问题。
有没有办法知道片段何时调整大小或调整大小已被触发?如果我可以使用该侦听器根据需要删除额外的填充。
对此有什么想法吗?
编辑
我已经尝试将 fitsystemwindows=true 放在主 activity 中,但它在导航栏的底部有一些填充。我需要 activity 来填充整个屏幕,因为导航栏是隐藏的
我已经按照 Matej Snoha 的评论解决了这个问题。此方法将侦听器附加到片段,当它看到 heightDifference(也是键盘的大小)大于导航栏的高度时,它会在视图底部放置一个填充,从而允许它滚动当键盘打开时。
public class FragmentResizeUtil {
public static void setListenerforResize(final View root, Fragment fragment) {
final int navigationbarHeight = getNavigationBarHeight(fragment);
root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
Rect r = new Rect();
root.getWindowVisibleDisplayFrame(r);
int screenHeight = root.getRootView().getHeight();
int heightDifference = screenHeight - (r.bottom - r.top);
if (heightDifference > navigationbarHeight) {
root.setPadding(0, 0, 0, heightDifference);
} else {
root.setPadding(0, 0, 0, 0);
}
}
});
}
private static int getNavigationBarHeight(Fragment fragment) {
Resources resources = fragment.getResources();
int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
return resources.getDimensionPixelSize(resourceId);
}
return 0;
}
}
我有一个 activity 包含一个片段和其他几个片段。
这个 activity 已经有 fitsSystemWindows=false
,所以它会将它的边界扩展到屏幕的最底部,顺便说一句,我隐藏了导航栏。
问题是,它有一个片段,其中有一个 RichEditor 视图,这意味着用户应该能够在该片段中放置多行文本。所以我制作了片段 fitsSystemWindows=true
以便当用户开始单击 RichEditor 和类型时,我在样式中设置的 adjustResize
标志将启动并允许用户滚动页面。
它会调整大小并允许用户滚动是。
唯一的问题是,当片段调整大小时,它会在顶部和底部获得额外的填充,并且由于我在主 activity 上有一个自定义工具栏,所以在屏幕上添加它非常笨拙。有趣的是,top padding 和设备状态栏的高度完全一样,bottom padding 和导航栏的高度完全一样。
我尝试将片段布局中的 clipToPadding
属性设置为 true 和 false,但它不会阻止片段获取额外的填充。我也四处搜索,但我找不到任何有用的方法来解决这个问题,因为我遇到的大多数问题都是关于如何允许调整大小发生的,而不是关于如何删除或停止填充的任何问题。
有没有办法知道片段何时调整大小或调整大小已被触发?如果我可以使用该侦听器根据需要删除额外的填充。
对此有什么想法吗?
编辑 我已经尝试将 fitsystemwindows=true 放在主 activity 中,但它在导航栏的底部有一些填充。我需要 activity 来填充整个屏幕,因为导航栏是隐藏的
我已经按照 Matej Snoha 的评论解决了这个问题。此方法将侦听器附加到片段,当它看到 heightDifference(也是键盘的大小)大于导航栏的高度时,它会在视图底部放置一个填充,从而允许它滚动当键盘打开时。
public class FragmentResizeUtil {
public static void setListenerforResize(final View root, Fragment fragment) {
final int navigationbarHeight = getNavigationBarHeight(fragment);
root.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
Rect r = new Rect();
root.getWindowVisibleDisplayFrame(r);
int screenHeight = root.getRootView().getHeight();
int heightDifference = screenHeight - (r.bottom - r.top);
if (heightDifference > navigationbarHeight) {
root.setPadding(0, 0, 0, heightDifference);
} else {
root.setPadding(0, 0, 0, 0);
}
}
});
}
private static int getNavigationBarHeight(Fragment fragment) {
Resources resources = fragment.getResources();
int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
return resources.getDimensionPixelSize(resourceId);
}
return 0;
}
}