为什么片段在显示键盘时调整大小时会在顶部和底部填充?

时间:2015-11-15 14:16:58

标签: android android-fragments android-softkeyboard

我有一个托管片段的活动,还有其他一些活动。

此活动已经fitsSystemWindows=false,因此它会将其边界扩展到屏幕的最底部,我正在隐藏导航栏btw。

问题是,它有一个片段,里面有一个RichEditor视图,这意味着用户应该能够在该片段中放置多行文本。所以我创建了片段fitsSystemWindows=true,以便当用户开始点击RichEditor和类型时,我在样式中设置的adjustResize标志将启动并允许用户滚动页面。

它调整大小并允许用户滚动是。

唯一的问题是,当片段调整大小时,它会在顶部和底部获得额外的填充,因为我在主活动上有一个自定义工具栏,所以在屏幕上添加它是非常笨拙的。有趣的是,顶部填充与设备状态栏的高度完全相同,底部填充与导航栏的高度完全相同。

我尝试将片段布局中的clipToPadding属性设置为true和false,但它不会阻止片段获得额外的填充。我也搜索过,但是我无法解决这个问题,因为我遇到的大多数问题都是关于如何允许调整大小发生,而不是关于如何删除或停止填充。

是否有任何方法可以知道片段何时调整大小或是否已触发调整大小?如果我能使用该监听器根据需要删除额外的填充。

对此有何想法?

EDIT 我已经尝试在主活动中输入fitsystemwindows = true,但它在导航栏的底部有一些填充。我需要活动来填充整个屏幕,因为隐藏了导航栏

1 个答案:

答案 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;
}
}