在 Android Studio 中动态设置按钮的约束

Setting Constraints of a button dynamically in Android Studio

我的应用程序中有一个 NumberPicker,根据选择的数字,一些 editText 出现(这些 editText 被放入 xml 文件中作为不可见的,然后在 java 文件中我根据选择的数字将它们设置为可见)。问题是我想在这些 editTexts 的底部添加一个按钮,所以在开始时按钮应该在第一个 editText 下面,但是如果用户选择数字 2,按钮应该只出现在第二个 editText 下面等等on... 所有的 editText 都放在线性布局中。为了更好的解释,我放了两张与我想要得到的相关的图片。

我的xml文件如下:

<LinearLayout
            android:id="@+id/linearLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            android:layout_gravity="center_vertical"
            android:padding="30dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/numberPicker">
<EditText
                android:id="@+id/text1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="0dp"
                android:paddingRight="43dp"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="parent"
                android:hint="Inserisci la location"
                android:inputType="text"
                android:textSize="18sp"
                android:textStyle="bold"
                android:visibility="visible"
                />
 <TextView
                android:id="@+id/getCurrentLocation"
                android:layout_width="wrap_content"
                android:layout_height="35dp"
                android:background="#00FFFFFF"
                android:backgroundTint="#01FFFFFF"
                android:paddingLeft="90dp"
                android:backgroundTintMode="multiply"
                android:text="Get my current location"
                android:textStyle="bold" />


  <Button
                android:id="@+id/button"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@drawable/button_rounded"
                android:text="Search Places"
                android:textColor="#ffffff"
                android:textSize="22sp" />
  <EditText
                android:id="@+id/text2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="0dp"
                android:paddingRight="43dp"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="parent"
                android:hint="Inserisci la location"
                android:inputType="text"
                android:textSize="18sp"
                android:textStyle="bold"
                android:visibility="invisible"
                />
   etc... 
   <EditText
                android:id="@+id/text20"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="0dp"
                android:paddingRight="43dp"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toBottomOf="parent"
                android:hint="Inserisci la location"
                android:inputType="text"
                android:textSize="18sp"
                android:textStyle="bold"
                android:visibility="invisible"
                />

Java 文件如下:

mtext1 = (EditText) findViewById(R.id.text1);
mtext2 = (EditText) findViewById(R.id.text2);
etc...
mtext20 = (EditText) findViewById(R.id.text20);
mGetPlaces = (Button) findViewById(R.id.button);


numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {


        @Override
        public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
            
            switch (newVal) {
                case 1:
                    mtext2.setVisibility(View.INVISIBLE);
                    mtext3.setVisibility(View.INVISIBLE);
                    etc...
                    mtext20.setVisibility(View.INVISIBLE);
                    
                 break;

                case 2:
                    mtext2.setVisibility(View.VISIBLE); 
                    mtext3.setVisibility(View.INVISIBLE); 
                    etc...
                    mtext20.setVisibility(View.INVISIBLE); 
                break;

                etc...

                case 20:
                    mtext2.setVisibility(View.VISIBLE); 
                    mtext3.setVisibility(View.VISIBLE); 
                    etc...
                    mtext20.setVisibility(View.VISIBLE); 

                    break;
            }
        }    

我试过将下面的代码放在case 2中,但是按钮完全消失了,也没有出现错误。

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mGetPlaces.getLayoutParams();
params.setMarginStart(mtext2.getId());
mGetPlaces.setLayoutParams(params);

在xml中可以设置

app:layout_constraintTop_toBottomOf="@+id/name"

但是,我没有找到将其应用于 java 代码的任何解决方案。

看看ConstraintSet。网上有一些教程介绍如何使用 ConstraintSets 以编程方式创建和修改约束。

您也可以使用 GONE widgets。第二个 EditText 的可见性可能为“消失”,这样底部按钮会向上浮动到第一个 EditText 下方,并在第二个 EditText 可见。