Ustawienie width na wrap_content dla TextView za pomocą kodu

92

Czy ktoś może mi pomóc, jak ustawić szerokość TextViewdo wrap_contentkodu, a nie z XML?

Tworzę dynamicznie TextVieww kodzie, więc czy jest jakiś sposób, jak ustawić jego szerokość w wrap_contentkodzie?

Android_programmer_camera
źródło

Odpowiedzi:

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

Dla różnych układów, takich jak ConstraintLayouti inne, mają swoje własne LayoutParams, takie jak:

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

lub

parentView.addView(pf, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
Franco
źródło
8
android.view.ViewGroup$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams
Francisco Corrales Morales
cóż, główna różnica polega na tym, że w pierwszym kodzie tworzymy już nowy TextView z tymi ustawieniami. W drugim dodajemy do istniejącego widoku, a także ustawiamy te parametry. Jeśli chodzi o problem z obsadą, myślę, że musisz obsadzić odpowiednią klasę
Franco
78

Jest inny sposób na osiągnięcie tego samego rezultatu. Jeśli potrzebujesz ustawić tylko jeden parametr, na przykład „wysokość”:

TextView textView = (TextView)findViewById(R.id.text_view);
ViewGroup.LayoutParams params = textView.getLayoutParams();
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
textView.setLayoutParams(params);
Dmitry
źródło
To działa świetnie. Jeśli zostanie to zrobione LinearLayout, nie wydaje się, że ll.invalidate()jest to konieczne. Czemu?
midiwriter
1
Chyba nigdy się nie dowiemy
Denny
49

Rozwiązanie do zmiany TextViewszerokości zawijania zawartości .

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
źródło
6
Proste i trafne rozwiązanie, ponieważ nie zastępuje innych parametrów.
CoolMind
2
Oznaczyłem moją odpowiedź do usunięcia, ponieważ jest to znacznie prostsze.
FrankKrumnow
2
To najlepsze rozwiązanie
pedram shabani
4

Publikuję wielowierszowy edittext Android 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
źródło
1

Myślę, że ten kod odpowiada na twoje pytanie

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) 
holder.desc1.getLayoutParams();
params.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
holder.desc1.setLayoutParams(params);
DeVYaGhI
źródło
0

Mała aktualizacja tego postu: jeśli używasz ktx w swoim projekcie na Androida, istnieje mała metoda pomocnicza, która znacznie ułatwia aktualizację LayoutParams.

Jeśli chcesz zaktualizować np. Tylko szerokość, możesz to zrobić za pomocą następującej linii w Kotlinie.

tv.updateLayoutParams { width = WRAP_CONTENT }
Stefan Medack
źródło