2012-03-13 12 views
41

Wstawiam moduł czatu w grze do aplikacji. Dodaję wiadomości tekstowe po ich otrzymaniu do widoku LinearLayout. Chcę ustawić parametry układu do TextView, ale następujący kod ulega awariom, a komunikaty o błędach mnie męczą.android - programowanie programowo LayoutParams

private void addChat(String chat, String when, Boolean mine) { 
    int leftMargin; 

    TextView tv = new TextView(this); 
    llview.addView(tv); 
    tv.setTextColor(Color.WHITE); 
    tv.setTextSize(2,25); 
    tv.setText(chat); 
    if (mine) { 
     leftMargin = 5; 
     tv.setBackgroundColor(0x7C5B77); 
    } 
    else { 
     leftMargin = 50; 
     tv.setBackgroundColor(0x778F6E); 
    } 
    final ViewGroup.MarginLayoutParams lpt =(MarginLayoutParams)tv.getLayoutParams(); 
    lpt.setMargins(leftMargin,lpt.topMargin,lpt.rightMargin,lpt.bottomMargin); 

    tv.setLayoutParams(new ViewGroup.LayoutParams(
      ViewGroup.LayoutParams.WRAP_CONTENT, 
      ViewGroup.LayoutParams.WRAP_CONTENT)); 

} 

kiedy biegnie, wszystkie powyższe kodu wykonuje ale wywala w android starcie jako:

03-13 14:15:38.513: E/AndroidRuntime(12985): java.lang.ClassCastException:  android.view.ViewGroup$LayoutParams 

i przechodzeniu z debuggera, to faktycznie przetwarza wszystkie te linie

ale następnie barfs przy próbie wyświetlenia z równie tajemniczą szczegółową wiadomością szczegółową:

android.view.ViewGroup$LayoutParams 

Co więc zrobiliśmy, aby dostać się do tego stanu? Co powinienem robić, aby wyświetlać naprzemiennie wiadomości z wcięciem w lewo/prawo?

Odpowiedz

83

Wystarczy wymienić od dołu i dodać ten

tv.setLayoutParams(new ViewGroup.LayoutParams(
    ViewGroup.LayoutParams.WRAP_CONTENT, 
    ViewGroup.LayoutParams.WRAP_CONTENT)); 

przed

llview.addView(tv); 
+1

Jak ustawićLayoutParams w wartościach 'dp' zamiast' wrap_content' lub 'match_parent'. Chcę ustawić go na "100dp". –

+0

Mam dokładnie to samo pytanie i nie mogę znaleźć rozwiązania. – Prabhakar

24

po utworzeniu widoku musimy dodać parametry układu.

zmiana jak ten

TextView tv = new TextView(this); 
tv.setLayoutParams(new ViewGroup.LayoutParams(
     ViewGroup.LayoutParams.WRAP_CONTENT, 
     ViewGroup.LayoutParams.WRAP_CONTENT)); 

llview.addView(tv); 
tv.setTextColor(Color.WHITE); 
tv.setTextSize(2,25); 
tv.setText(chat); 
if (mine) { 
    leftMargin = 5; 
    tv.setBackgroundColor(0x7C5B77); 
} 
else { 
    leftMargin = 50; 
    tv.setBackgroundColor(0x778F6E); 
} 
final ViewGroup.MarginLayoutParams lpt =(MarginLayoutParams)tv.getLayoutParams(); 
lpt.setMargins(leftMargin,lpt.topMargin,lpt.rightMargin,lpt.bottomMargin); 
+3

'lpt.setMargins (..)' nie wydaje mieć jakikolwiek efekt. Niezależnie od tego, czy ustawię go na 2, czy 20, wygląda dokładnie tak samo. W ogóle nie widzę przestrzeni utworzonej dla marginesów. Próbowałem go dla 'LinearLayout', a nie' TextView'. – faizal

+1

^tv.setLayoutParams (lpt) po poleceniu lpt.setMargins() – worked

+0

Jak ustawićLayoutParams w wartościach 'dp' zamiast' wrap_content' lub 'match_parent'. Chcę ustawić go na "100dp". –

0
LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
        /*width*/ ViewGroup.LayoutParams.MATCH_PARENT, 
        /*height*/ ViewGroup.LayoutParams.MATCH_PARENT, 
        /*weight*/ 1.0f 
      ); 
      YOUR_VIEW.setLayoutParams(param); 
Powiązane problemy