我有一个托管片段的活动,还有其他一些活动。
此活动已经fitsSystemWindows=false
,因此它会将其边界扩展到屏幕的最底部,我正在隐藏导航栏btw。
问题是,它有一个片段,里面有一个RichEditor视图,这意味着用户应该能够在该片段中放置多行文本。所以我创建了片段fitsSystemWindows=true
,以便当用户开始点击RichEditor和类型时,我在样式中设置的adjustResize
标志将启动并允许用户滚动页面。
它调整大小并允许用户滚动是。
唯一的问题是,当片段调整大小时,它会在顶部和底部获得额外的填充,因为我在主活动上有一个自定义工具栏,所以在屏幕上添加它是非常笨拙的。有趣的是,顶部填充与设备状态栏的高度完全相同,底部填充与导航栏的高度完全相同。
我尝试将片段布局中的clipToPadding
属性设置为true和false,但它不会阻止片段获得额外的填充。我也搜索过,但是我无法解决这个问题,因为我遇到的大多数问题都是关于如何允许调整大小发生,而不是关于如何删除或停止填充。
是否有任何方法可以知道片段何时调整大小或是否已触发调整大小?如果我能使用该监听器根据需要删除额外的填充。
对此有何想法?
EDIT 我已经尝试在主活动中输入fitsystemwindows = true,但它在导航栏的底部有一些填充。我需要活动来填充整个屏幕,因为隐藏了导航栏
答案 0 :(得分:0)
我已经通过遵循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;
}
}