由于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
答案 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
提供的任何尺寸。
使用此解决方案滚动小内容,即使内容在顶部对齐,也不会像滚动大内容一样平滑。我会一直使用,直到修复库。
在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)) {
};
}
});