应用后,Android NestedScrollView的大小错误:layout_behavior

时间:2015-06-03 06:22:30

标签: android android-layout android-design-library

由于Google已经发布了针对Android的设计支持库,因此可以在不实现自定义代码的情况下完成许多好事。虽然我已经在这个lib中测试了自定义视图,但我发现了一个更糟糕的事情,我不知道这是不是一个bug。

我在github上找到了cheesesquare项目。在 activity_detail.xml(布局文件)中,NestedScrollView中有3个CardView。如果删除其中的2个,则可以看到NestedScrollView没有父级的完整大小(match_parent)。 NestedScrollView绑定到父视图的底部。 http://i.stack.imgur.com/BXl7w.png

当我删除app:layout_behavior="@string/appbar_scrolling_view_behavior"时,NestedScrollView得到的是他的完整尺寸。

但是当我删除布局行为时,工具栏不会折叠。

有没有解决这个问题?可以在此处找到示例布局文件:https://github.com/Smove/cheesesquare/blob/stackoverflow/app/src/main/res/layout/activity_detail.xml

您可以从我的github分支stackoverflow

构建cheesesquare apk

5 个答案:

答案 0 :(得分:32)

我遇到了这个问题并修复了添加:

android:layout_gravity="fill_vertical"

到NestedScrollView。然后它开始正常运行,我也解释了here。当然NestedScrollView需要某种孩子(即它不能为空),否则工具栏不会崩溃。

更新

虽然这个内容很小,但很好,但我注意到它有一些显示更长内容的问题,例如:就像上面的完整activity_detail.xml一样。问题是你无法滚动到内容的最底部 - 它在底部无法访问。

从我的测试中我发现缺少的部分与折叠的工具栏一样大(或者至少是它对我来说的样子)。要解决这个问题,并且为小内容和大内容提供可靠的解决方案,您应该向ScrollView添加layout_marginBottom,以便测量它并发布缺少的底部。因此:

android:layout_gravity="fill_vertical"
android:layout_marginBottom="?attr/actionBarSize"

或您为Toolbar提供的任何尺寸。

但仍然

使用此解决方案滚动小内容,即使内容在顶部对齐,也不会像滚动大内容一样平滑。我会一直使用,直到修复库。

UPDATE2

在v22.2.1中看起来已经修复了这个问题。

答案 1 :(得分:1)

使用@natario的答案如果您改为为孩子设置填充(本例中为LinearLayout),则会看起来更好:

<androidx.core.widget.NestedScrollView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                app:layout_behavior="@string/appbar_scrolling_view_behavior"
                android:layout_gravity="fill_vertical">
                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:paddingBottom="?attr/actionBarSize">
                <!--Rest of the code-->

或者在Kotlin中,您可以执行以下操作:

 coordinator.doOnLayout {
        nestedScrollView.minimumHeight = resources.displayMetrics.heightPixels - with(TypedValue().also {theme.resolveAttribute(android.R.attr.actionBarSize, it, true)}) {
            TypedValue.complexToDimensionPixelSize(data, resources.displayMetrics)}
    }

答案 2 :(得分:0)

android:minHeight="?attr/actionBarSize" 添加到 CollapsingToolbarLayout

答案 3 :(得分:-2)

解决方法

在显示我的NestedScrollView并将数据绑定到NestedScrollView内容之前,我以View.FOCUS_UP方向作为参数调用我的NestedScrollView实例的方法fullScroll(int direction)。

片段的代码示例:

NestedScrollView scrollView =(NestedScrollView)getActivity()。findViewById(R.id.scroll_view); scrollView.fullScroll(View.FOCUS_UP);

答案 4 :(得分:-3)

使用RecyclerView替换NestedScrollView修复此错误 设置项目数1,即ViewHolder返回真实的contentView;

我的代码:

    RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);

    recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
    // 添加分割线
    recyclerView.addItemDecoration(new DividerItemDecoration(getApplicationContext()));

    recyclerView.setAdapter(new Adapter<ViewHolder>() {

        @Override
        public int getItemCount() {
            return 1;
        }

        @Override
        public void onBindViewHolder(ViewHolder holder, int arg1) {
            WebView view = (WebView) holder.itemView;
            view.getSettings().setJavaScriptEnabled(true);
            view.loadUrl("http://www.baidu.com");
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup arg0, int arg1) {
            return new ViewHolder(inflater.inflate(R.layout.webview, arg0, false)) {
            };
        }
    });