การตั้งค่าความกว้างให้กับ wrap_content สำหรับ TextView ผ่านโค้ด


92

ทุกคนสามารถช่วยเหลือฉันวิธีการกำหนดความกว้างของTextViewการwrap_contentผ่านรหัสและไม่ได้มาจาก XML?

ฉันกำลังสร้างTextViewรหัสในแบบไดนามิกดังนั้นจะมีวิธีตั้งค่าความกว้างเป็นwrap_contentรหัสผ่านได้อย่างไร

คำตอบ:


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

สำหรับเค้าโครงที่แตกต่างกันเช่นConstraintLayoutและอื่น ๆ พวกเขามีของตัวเองLayoutParamsดังนี้:

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

หรือ

parentView.addView(pf, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

8
android.view.ViewGroup$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams
Francisco Corrales Morales

ความแตกต่างหลักคือในโค้ดแรกเรากำลังสร้าง TextView ใหม่พร้อมการตั้งค่านั้นแล้ว ในอันที่สองเรากำลังเพิ่มเข้าไปในมุมมองที่มีอยู่และเรากำลังตั้งค่าพารามิเตอร์เหล่านั้นด้วย สำหรับปัญหานักแสดงฉันคิดว่าคุณต้องแคสต์คลาสที่เหมาะสม
Franco

78

มีอีกวิธีหนึ่งที่จะบรรลุผลเช่นเดียวกัน ในกรณีที่คุณต้องการตั้งค่าพารามิเตอร์เพียงตัวเดียวเช่น "ความสูง":

TextView textView = (TextView)findViewById(R.id.text_view);
ViewGroup.LayoutParams params = textView.getLayoutParams();
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
textView.setLayoutParams(params);

ใช้งานได้ดี หากดำเนินการเสร็จแล้วLinearLayoutไม่ปรากฏว่าll.invalidate()จำเป็น ทำไม?
midiwriter

1
ฉันเดาว่าเราจะไม่มีทางรู้
Denny

49

โซลูชั่นสำหรับการเปลี่ยนแปลงTextViewความกว้างเนื้อหาห่อ

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

6
วิธีแก้ปัญหาที่ง่ายและถูกต้องเพราะไม่ได้ลบล้างพารามิเตอร์อื่น ๆ
CoolMind

2
ทำเครื่องหมาย anwer ของฉันสำหรับการลบเนื่องจากง่ายกว่ามาก
FrankKrumnow

2
นี่คือทางออกที่ดีที่สุด
pedram shabani

4

ฉันกำลังโพสต์ข้อความแก้ไขหลายบรรทัดฐาน Java ของ Android

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 */

1

ฉันคิดว่ารหัสนี้ตอบคำถามของคุณได้

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

0

การอัปเดตเล็กน้อยในโพสต์นี้: หากคุณใช้ ktx ในโปรเจ็กต์ Android ของคุณมีวิธีการช่วยเหลือเล็กน้อยที่ทำให้การอัปเดต LayoutParams ง่ายขึ้นมาก

หากคุณต้องการอัปเดตเช่นเฉพาะความกว้างคุณสามารถทำได้ด้วยบรรทัดต่อไปนี้ใน Kotlin

tv.updateLayoutParams { width = WRAP_CONTENT }
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.