NestedScrollView 在以编程方式添加 TextView 时不滚动
NestedScrollView not scrolling when adding TextViews programmatically
我在我的应用程序的一个屏幕上包括棋盘和棋子,我想在其下方添加一个可滚动的视图,以在用户下棋时显示下棋符号。我可以将文本添加到视图中,但无论我怎样尝试,视图都不会滚动。
我广泛研究了其他用户遇到的这个问题。我已经包括 fillViewport="true" 和 layout_height="wrap_content" 但这些解决方案都不适合我。我试过 nestedscrollview 的边距无济于事,过去几天我一直遇到这个问题,但仍然没有弄清楚我做错了什么。
这是 xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/chessBoardScreen"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:focusable="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".ChessBoardActivity"
tools:showIn="@layout/app_bar_chess_board">
<android.support.constraint.ConstraintLayout
android:id="@+id/cl_parent"
android:layout_width="wrap_content"
android:layout_height="350dp"
app:layout_constraintBottom_toTopOf="@+id/move_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/board"
android:layout_width="wrap_content"
android:layout_height="329dp"
android:layout_marginTop="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/chess_board" />
<android.support.constraint.ConstraintLayout
android:id="@+id/cl"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>
<android.support.v4.widget.NestedScrollView
android:id="@+id/move_view"
android:layout_width="0dp"
android:layout_height="0dp"
android:fillViewport="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/cl_parent">
<android.support.constraint.ConstraintLayout
android:id="@+id/move_list"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.constraint.ConstraintLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.constraint.ConstraintLayout>
这里是我在我的应用程序中调用 xml 文件的地方,每次用户在棋盘上成功移动时都会执行此代码:
ConstraintLayout ml = findViewById(R.id.move_list);
TextView tv = new TextView(ChessBoardActivity.this);
float left = 34*density;
float top;
if(move == 'b') left += screenX/2.0;
top = (-30+30*turns)*density;
tv.setWidth((int)(screenX/2-34*density));
tv.setHeight((int)(30*density));
tv.setTranslationX(left);
tv.setTranslationY(top);
tv.setText(moveString);
ml.addView(tv);
如果能帮助解决这个问题,我们将不胜感激!谢谢:)
我希望 nestedscrollview 在 textviews 绘制超出屏幕但在视图范围内时可滚动,但它根本不滚动。
编辑:
我刚刚注意到代码中的实际问题。您正在使用翻译手动设置位置,这样做将 不更新 父布局的高度,这就是滚动视图不会滚动的原因。您应该使用 LinearLayout,这样您就不必计算位置,如果有两列,您可以使用 GridLayout。
旧答案:
调用 scrollView.invalidate()
以便 scrollview 可以适应变化。如果它不起作用,那么还要在 ConstraintLayout 上调用 invalidate()
。
如果还是不行,再调用requestLayout()
。
ml.addView(tv);
ml.invalidate();
NestedScrollView scrollView = findViewById(R.id.move_view);
scrollView.invalidate();
scrollView.requestLayout();
我在我的应用程序的一个屏幕上包括棋盘和棋子,我想在其下方添加一个可滚动的视图,以在用户下棋时显示下棋符号。我可以将文本添加到视图中,但无论我怎样尝试,视图都不会滚动。
我广泛研究了其他用户遇到的这个问题。我已经包括 fillViewport="true" 和 layout_height="wrap_content" 但这些解决方案都不适合我。我试过 nestedscrollview 的边距无济于事,过去几天我一直遇到这个问题,但仍然没有弄清楚我做错了什么。
这是 xml 文件:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/chessBoardScreen"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"
android:focusable="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".ChessBoardActivity"
tools:showIn="@layout/app_bar_chess_board">
<android.support.constraint.ConstraintLayout
android:id="@+id/cl_parent"
android:layout_width="wrap_content"
android:layout_height="350dp"
app:layout_constraintBottom_toTopOf="@+id/move_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/board"
android:layout_width="wrap_content"
android:layout_height="329dp"
android:layout_marginTop="8dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:srcCompat="@drawable/chess_board" />
<android.support.constraint.ConstraintLayout
android:id="@+id/cl"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
</android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>
<android.support.v4.widget.NestedScrollView
android:id="@+id/move_view"
android:layout_width="0dp"
android:layout_height="0dp"
android:fillViewport="true"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/cl_parent">
<android.support.constraint.ConstraintLayout
android:id="@+id/move_list"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.constraint.ConstraintLayout>
</android.support.v4.widget.NestedScrollView>
</android.support.constraint.ConstraintLayout>
这里是我在我的应用程序中调用 xml 文件的地方,每次用户在棋盘上成功移动时都会执行此代码:
ConstraintLayout ml = findViewById(R.id.move_list);
TextView tv = new TextView(ChessBoardActivity.this);
float left = 34*density;
float top;
if(move == 'b') left += screenX/2.0;
top = (-30+30*turns)*density;
tv.setWidth((int)(screenX/2-34*density));
tv.setHeight((int)(30*density));
tv.setTranslationX(left);
tv.setTranslationY(top);
tv.setText(moveString);
ml.addView(tv);
如果能帮助解决这个问题,我们将不胜感激!谢谢:)
我希望 nestedscrollview 在 textviews 绘制超出屏幕但在视图范围内时可滚动,但它根本不滚动。
编辑:
我刚刚注意到代码中的实际问题。您正在使用翻译手动设置位置,这样做将 不更新 父布局的高度,这就是滚动视图不会滚动的原因。您应该使用 LinearLayout,这样您就不必计算位置,如果有两列,您可以使用 GridLayout。
旧答案:
调用 scrollView.invalidate()
以便 scrollview 可以适应变化。如果它不起作用,那么还要在 ConstraintLayout 上调用 invalidate()
。
如果还是不行,再调用requestLayout()
。
ml.addView(tv);
ml.invalidate();
NestedScrollView scrollView = findViewById(R.id.move_view);
scrollView.invalidate();
scrollView.requestLayout();