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

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