Menyetel lebar ke wrap_content untuk TextView melalui kode

92

Siapa pun dapat membantu saya bagaimana untuk mengatur lebar TextViewuntuk wrap_contentmelalui kode dan bukan dari XML?

Saya secara dinamis membuat TextViewkode in, jadi adakah cara untuk mengatur lebarnya wrap_contentmelalui kode?

Android_programmer_camera
sumber

Jawaban:

127
TextView pf = new TextView(context);
pf.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

Untuk tata letak yang berbeda seperti ConstraintLayoutdan lainnya, mereka memiliki sendiri LayoutParams, seperti:

pf.setLayoutParams(new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 

atau

parentView.addView(pf, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
Franco
sumber
8
android.view.ViewGroup$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams
Francisco Corrales Morales
Nah, perbedaan utamanya adalah di kode pertama kita membuat TextView baru dengan pengaturan itu. Yang kedua, kami menambahkan ke tampilan yang ada, dan juga kami mengatur parameter tersebut. Untuk masalah pemeran, saya pikir Anda harus memasukkan kelas yang tepat
Franco
78

Ada cara lain untuk mencapai hasil yang sama. Jika Anda hanya perlu menetapkan satu parameter, misalnya 'tinggi':

TextView textView = (TextView)findViewById(R.id.text_view);
ViewGroup.LayoutParams params = textView.getLayoutParams();
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
textView.setLayoutParams(params);
Dmitry
sumber
Ini bekerja dengan baik. Jika hal ini dilakukan LinearLayout, tampaknya tidak ll.invalidate()perlu. Mengapa?
midiwriter
1
Saya kira kita tidak akan pernah tahu
Denny
49

Solusi untuk mengubah TextViewlebar untuk membungkus konten .

textView.getLayoutParams().width = ViewGroup.LayoutParams.WRAP_CONTENT; 
textView.requestLayout();  
// Call requestLayout() for redraw your TextView when your TextView is already drawn (laid out) (eg: you update TextView width when click a Button). 
// If your TextView is drawing you may not need requestLayout() (eg: you change TextView width inside onCreate()). However if you call it, it still working well => for easy: always use requestLayout()

// Another useful example
// textView.getLayoutParams().width = 200; // For change `TextView` width to 200 pixel
Phan Van Linh
sumber
6
Solusi sederhana dan tepat, karena tidak menimpa parameter lain.
CoolMind
2
Tandai jawaban saya untuk dihapus karena ini jauh lebih sederhana.
FrankKrumnow
2
Ini adalah solusi terbaik
pedram shabani
4

Saya memposting teks edittext multi baris android berbasis Java.

EditText editText = findViewById(R.id.editText);/* edittext access */

ViewGroup.LayoutParams params  =  editText.getLayoutParams(); 
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
editText.setLayoutParams(params); /* Gives as much height for multi line*/

editText.setSingleLine(false); /* Makes it Multi line */
Aadarsh ​​Mathur
sumber
1

Saya pikir kode ini menjawab pertanyaan Anda

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) 
holder.desc1.getLayoutParams();
params.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
holder.desc1.setLayoutParams(params);
DeVYaGhI
sumber
0

Sedikit pembaruan pada posting ini: jika Anda menggunakan ktx dalam proyek Android Anda, ada sedikit metode pembantu yang membuat pembaruan LayoutParams jauh lebih mudah.

Jika Anda ingin memperbarui, misalnya hanya lebarnya, Anda dapat melakukannya dengan baris berikut di Kotlin.

tv.updateLayoutParams { width = WRAP_CONTENT }
Stefan Medack
sumber