Saya memiliki 2 tampilan teks, satu di atas yang lain:
XXXXXXXXXXXX[TextView1]
XXXXXXXXXXXX[TextView2]
- Kedua TextView sejajar ke kanan. (Oleh karena itu XXX di atas)
- TextView1 memiliki warna latar belakang.
- TextView2 selalu lebih panjang dari TextView1
- Kiri TextView1 harus sejajar dengan TextView2
Saya memiliki 4 persyaratan di atas. Sekarang semuanya bekerja dengan baik menggunakan ConstraintLayout, di mana bagian kiri TextView1 dibatasi ke bagian kiri TextView2, dan lebar TextView2 adalah wrap_content.
Tapi sekarang datang persyaratan ke-5:
- TextView2 dapat menghilang, meninggalkan TextView1.
setVisibility(GONE)
tidak berfungsi, karena TextView2 harus wrap_content
. itu akan menjadi 0 lebarnya dan karenanya TextView1 juga (karena kirinya dibatasi ke kiri TextView2)
Kemudian saya mencoba mengatur ketinggian TextView2 menjadi 0, menggunakan kode di bawah ini:
ConstraintLayout.LayoutParams lp = (ConstraintLayout.LayoutParams)textView2.getLayoutParams();
lp.width = widthInPixelOrConstant;
textView2.setLayoutParams(lp);
Ups, tidak ada yang terjadi. TextView2 tetap di sana, seolah-olah tidak terjadi apa-apa. Saya mencari di Google selama setengah jam, dan akhirnya memutuskan untuk membungkus TextView2file LinearLayout.
Dan kemudian gunakan kode di bawah ini untuk menyetel ketinggian TextView2 menjadi 0:
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams )view.getLayoutParams();
lp.width = widthInPixelOrConstant;
view.setLayoutParams(lp);
Jadi, ternyata, kita tidak bisa menggunakan apa yang kita gunakan sebelumnya - setLayoutParamsuntuk mencoba mengubah tinggi atau lebar anak ConstraintLayout saat runtime.
Tapi kemudian, membungkus TextView2 itu dalam LinearLayout benar-benar bodoh. Adakah yang tahu cara mengubah lebar atau tinggi anak ConstraintLayout saat runtime?
Solutip
Coba tambahkan kendala saat runtime, seperti ini:
//Define some variables
TextView textView1;
TextView textView2;
ConstraintLayout constraintLayout;
//Initialize them, and so some stuff
textView1 = (TextView) findViewById(R.id.text1);
textView2 = (TextView) findViewById(R.id.text2);
constraintLayout = (ConstraintLayout) findViewById(R.id.constraintLayout);
int x = 200; //set some width
int y = 200; //Set some height
ConstraintLayout.LayoutParams lp = new ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.WRAP_CONTENT,
ConstraintLayout.LayoutParams.WRAP_CONTENT);
lp.width = x;
lp.height = y;
//moves TextView1's left to align with TextView2's left
lp.editorAbsoluteX = ((int) textView2.getX());
textView1.setLayoutParams(lp);
ConstraintSet constraintSet = new ConstraintSet();
constraintSet.clone(constraintLayout);
constraintSet.connect(R.id.text1,ConstraintSet.LEFT,R.id.text2,ConstraintSet.LEFT,0);
constraintSet.connect(R.id.text2,ConstraintSet.TOP,R.id.text1,ConstraintSet.BOTTOM,0);
constraintSet.applyTo(constraintLayout);