我一直在嘗試使用 ConstraintSet 以編程方式向 Android Studio 中的約束布局添加屏障,但我無法讓我的代碼正常作業,最終結果應該只是一個 textView,然后是它右側的一個屏障,以及另一個 textview從屏障的右側開始。我正在使用 ConstraintSet.createBarrier 方法添加屏障,這就是應用程式中的結果:
"TextView1""TextView2"
也就是說,textView2 從 textView1 的末尾開始,但 textView1 的長度是多少。這是activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@ id/content"
xmlns:app="http://schemas.android.com/apk/res-auto">
<TextView
android:id="@ id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView 1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
這是我在 MainActivity.java 中的代碼:
package com.example.test_application;
import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.Barrier;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintSet;
public class MainActivity extends AppCompatActivity {
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1)
@SuppressLint("ResourceType")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LayoutInflater inflater = getLayoutInflater();
ConstraintLayout myConstraintLayout = (ConstraintLayout) findViewById(R.id.content);
View textView1 = findViewById(R.id.textView1);
textView1.setId(1);
TextView textView2 = new TextView(this);
textView2.setId(2);
textView2.setText("HELLO");
myConstraintLayout.addView(textView2);
ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(myConstraintLayout);
int[] createBarrier_ids = {textView1.getId()};
constraintSet.createBarrier(3, Barrier.END,0, createBarrier_ids);
constraintSet.connect(textView2.getId(), ConstraintSet.START, 3, ConstraintSet.END,0);
constraintSet.connect(textView2.getId(), ConstraintSet.TOP, textView1.getId(), ConstraintSet.TOP,0);
constraintSet.applyTo(myConstraintLayout);
}
}
這是我運行時的結果:

請注意,當我禁用該行并且不更改 textView1 的 id 并再次運行代碼時,我如何textView1.setId(1)將 textView1 的 id 更改為 1(我也嘗試使用更改 idtextView1.setId(View.generateViewId())并獲得相同的結果)我得到了我想要的結果:

我究竟做錯了什么?為什么當我不更改 id 時它會作業?我希望能夠在我的代碼中更改 ID。
uj5u.com熱心網友回復:
我相信ConstraintLayout除了視圖層次結構本身之外還維護內部視圖相關的結構。當您更改 的 id 時textView1,該 id 不會傳播到這些其他內部結構。(猜測,但我相信這是一個很好的。)
如果您必須更改視圖的 id,我建議您將其從層次結構中洗掉并重新添加。這將強制ConstraintLayout接受您對其結構的更改。像這樣的東西:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LayoutInflater inflater = getLayoutInflater();
ConstraintLayout myConstraintLayout = (ConstraintLayout) findViewById(R.id.content);
View textView1 = findViewById(R.id.textView1);
myConstraintLayout.removeView(textView1); // So long old textView1!
textView1.setId(1);
myConstraintLayout.addView(textView1); // Hello new textView1.
TextView textView2 = new TextView(this);
textView2.setId(2);
textView2.setText("HELLO");
myConstraintLayout.addView(textView2);
ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(myConstraintLayout);
// Make sure to reconnect textView1 since it was added earlier.
constraintSet.connect(textView1.getId(),ConstraintSet.START,ConstraintSet.PARENT_ID,ConstraintSet.START);
constraintSet.connect(textView1.getId(),ConstraintSet.TOP,ConstraintSet.PARENT_ID,ConstraintSet.TOP);
int[] createBarrier_ids = {textView1.getId()};
constraintSet.createBarrier(3, Barrier.END,0, createBarrier_ids);
constraintSet.connect(textView2.getId(), ConstraintSet.START, 3, ConstraintSet.END,0);
constraintSet.connect(textView2.getId(), ConstraintSet.TOP, textView1.getId(), ConstraintSet.TOP,0);
constraintSet.applyTo(myConstraintLayout);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/331228.html
