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();