20

由于 Google 已经发布了 android 的设计支持库,因此无需实现自定义代码就可以完成许多好事情。虽然我已经测试了这个库中的自定义视图,但我发现了更糟糕的事情,我不知道这是否是一个错误。

我在 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".

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

有什么解决办法吗?示例布局文件可以在这里找到:https ://github.com/Smove/cheesesquare/blob/stackoverflow/app/src/main/res/layout/activity_detail.xml

您可以从我的 github 分支构建 cheesesquare apkstackoverflow

4

5 回答 5

36

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

android:layout_gravity="fill_vertical"

到 NestedScrollView。然后它开始正常运行,正如我在这里解释的那样。当然 NestedScrollView 需要某种子项(即不能为空),否则工具栏不会折叠。

更新

虽然这适用小内容,但我注意到它在显示较长内容时存在一些问题,例如activity_detail.xml上面的完整内容。问题是您无法滚动到内容的最底部 - 在底部无法访问。

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

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

或您给Toolbar.

但还是

使用此解决方案滚动小内容,即使内容恰好在顶部对齐,也不会像滚动大内容那样流畅。我会一直使用到库修复到来为止。

更新2

看起来这已在 v22.2.1 中修复。

于 2015-06-12T17:36:37.233 回答
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)}
    }
于 2020-08-16T16:03:35.787 回答
0

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

于 2021-04-17T10:38:34.907 回答
-2

解决方法

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

片段的代码示例:

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

于 2015-07-08T20:49:55.317 回答
-3

使用 RecyclerView 替换 NestedScrollView 修复这个 bug set item count 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)) {
            };
        }
    });
于 2015-06-12T17:33:42.960 回答