【问题标题】:Android ConstraintLayout: How to add a dynamic view one below anotherAndroid ConstraintLayout:如何在另一个下方添加动态视图
【发布时间】:2019-10-16 15:21:10
【问题描述】:

我正在尝试在运行时在约束布局中将 TextViews 添加到另一个下方。但我总是只得到一个文本视图,其余的隐藏在它后面。我尝试了几件事,包括链接视图,但似乎没有任何效果。

private void method(int position)
    {
        ConstraintSet set = new ConstraintSet();
        TextView textView = new TextView(getContext());
        int textViewId = 100 + position;
        //previousTextViewId = textViewId;
        textView.setId(textViewId);
        ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams(0, WRAP_CONTENT);
        layoutParams.rightToRight = PARENT_ID;
        layoutParams.leftToLeft = guideline_60.getId(); //Vertical GuideLine of 60%
        layoutParams.rightMargin = 8;
        textView.setLayoutParams(layoutParams);
        if (Build.VERSION.SDK_INT < 23)
        {
            textView.setTextAppearance(getContext(), R.style.textStyle);
        }
        else
        {
            textView.setTextAppearance(R.style.textStyle);
        }
        textView.setBackgroundColor(backgroundColor);
        textView.setText(categoryName);
        textView.setGravity(Gravity.CENTER);
//markerLayout is the ConstraintLayout 
        markerLayout.addView(textView, position);
        set.clone(markerLayout);
        //set.addToVerticalChain(textView.getId(),previousTextViewId,PARENT_ID);
        set.connect(textView.getId(), ConstraintSet.TOP, markerLayout.getId(), ConstraintSet.TOP, 60);
        set.applyTo(markerLayout);
    }

我期待看到这样的东西 -

【问题讨论】:

    标签: android android-layout android-constraintlayout


    【解决方案1】:

    你是说所有文本视图的顶部都连接在父视图的顶部:

    set.connect(textView.getId(), ConstraintSet.TOP, 
            markerLayout.getId(), ConstraintSet.TOP, 60);
    

    你想说,一个的顶部连接到另一个的底部 - 像这样:

    set.connect(textView.getId(), ConstraintSet.TOP, 
        previousTextView.getId(), ConstraintSet.BOTTOM, 60);
    

    你的方法叫method?

    【讨论】:

    • 我试图概括我的代码,因此将方法重命名为 "method" :) 。下面的代码我仍然有同样的问题 if(position == 0) { Timber.d("Position - "+ position); set.connect(textView.getId(), ConstraintSet.TOP, markerLayout.getId(), ConstraintSet.TOP, 16); } else { Timber.d("位置 - "+ 位置); set.connect(textView.getId(), ConstraintSet.TOP, previousTextViewId, ConstraintSet.BOTTOM, 16); }
    • 我的糟糕你的解决方案工作得很好。我有 previousTextViewId = textViewId;在设置之前。连接。我把它移到下面,它工作得很好。谢谢尼克。
    【解决方案2】:

    我知道这是旧答案,但 @Temporary 拯救了我的一天!!我使用行布局做了同样的事情。我没有得到动态添加行布局的完美解决方案,所以这可能对其他人有所帮助

    这是一个简单的例子:

    activity_main

    <androidx.core.widget.NestedScrollView
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:fillViewport="true"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@id/guideline_end"
            app:layout_constraintHorizontal_bias="1.0"
            app:layout_constraintStart_toEndOf="@id/guideline_start"
            app:layout_constraintTop_toBottomOf="@id/cvFDToolbar">
    
    
            <androidx.constraintlayout.widget.ConstraintLayout
                android:id="@+id/clItem"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"/>
    
    
        </androidx.core.widget.NestedScrollView>
    

    这里是行文件将动态添加。

    row_main

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:android="http://schemas.android.com/apk/res/android">
    
    
        <TextView
            android:id="@+id/txtTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/_5sdp"
            android:fontFamily="@font/raleway_medium"
            android:text="TextView"
            android:textColor="@color/black"
            android:textSize="@dimen/_14ssp"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <EditText
            android:id="@+id/edtValue"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/_5sdp"
            android:background="@color/gray"
            android:inputType="textPersonName"
            android:padding="@dimen/_5sdp"
            android:text="Name"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/txtTitle" />
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    这是动态添加行布局的代码。在您的 MainActivity 文件中添加代码。

    val set = ConstraintSet()
    
            for (i in 0..10) {
    
                val inflater = LayoutInflater.from(this)
    
                inflatedLayout = inflater.inflate(
                    com.doctor24_7.R.layout.row_pre_consultation_form,
                    clItem as ViewGroup,
                    false
                )
    
                inflatedLayout.id = 100 + i
                clItem.addView(inflatedLayout, i)
                set.clone(clItem)
                if (i ==0) {
                    set.connect(
                        ConstraintSet.PARENT_ID,
                        ConstraintSet.LEFT,
                        ConstraintSet.PARENT_ID,
                        ConstraintSet.LEFT,
                        60
                    )
                    set.connect(
                        ConstraintSet.PARENT_ID,
                        ConstraintSet.RIGHT,
                        ConstraintSet.PARENT_ID,
                        ConstraintSet.RIGHT
                    )
                    set.connect(
                        inflatedLayout.id,
                        ConstraintSet.TOP,
                        ConstraintSet.PARENT_ID,
                        ConstraintSet.TOP
                    )
                } else {
                    set.connect(
                        ConstraintSet.PARENT_ID,
                        ConstraintSet.LEFT,
                        ConstraintSet.PARENT_ID,
                        ConstraintSet.LEFT
                    )
                    set.connect(
                        ConstraintSet.PARENT_ID,
                        ConstraintSet.RIGHT,
                        ConstraintSet.PARENT_ID,
                        ConstraintSet.RIGHT
                    )
                    set.connect(
                        inflatedLayout.id,
                        ConstraintSet.TOP,
                        previousid,
                        ConstraintSet.BOTTOM, resources.getDimension(R.dimen._10sdp).toInt()
                    )
                }
                set.applyTo(clItem)
                previousid = inflatedLayout.id
    
            }
    

    【讨论】:

    • 感谢您的回答。这工作正常,我想提一件事,即在 for 循环之前添加变量 ``` var previousid = 100 ```..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多