2012-08-15 9 views
22

Ich habe das aus verschiedenen Blickwinkeln getroffen. Grundsätzlich ist der Kern dies:Android: LayoutParams für TextView lässt die Ansicht verschwinden, programmgesteuert

Ich habe eine Vorlage in XML für eine Schnittstelle, die programmgesteuert ausgeführt werden muss, so dass es dynamisch während des Laufs gefüllt wird.

Das Problem hier ist, dass das XML TextView einige Layout-Optimierungen hat (die funktionieren) und notwendig sind. Aber wenn ich sie tatsächlich in Code einstelle, erscheint das TextView nicht einmal.

(Die Textview, nebenbei gesagt, in einem TableRow verschachtelt ist, so dass das Gespräch auf dem Gewicht.) Die XML-Vorlage ich zum ersten Mal, die für den Code als Referenz zu verwenden, ist dies, und es funktioniert gut:

<TextView 
    android:id="@+id/txtviewWhiteBox" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="1.0" 
    android:background="@drawable/textview_9patch_white" 
    android:gravity="center" 
    android:text="75" 
    android:textColor="@android:color/black" 
    android:layout_margin="20dp" 
    android:padding="20dp" 
    android:textSize="40dp" /> 

Wie gesagt, das ist perfekt. Wenn ich dasselbe Layout in Code ausführe und LayoutParams anwende, verschwindet die TextView.

Hier ist der relevante Auszug:

int textViewExampleID = 9001; 

private TextView txtviewExample = new TextView(this); 

private void buildTextView(){ 
    LayoutParams paramsExample = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,1.0f); 
    txtviewExample.setId(textViewExampleID); 
    txtviewExample.setBackgroundResource(R.drawable.textview_9patch_white); 
    txtviewExample.setGravity(Gravity.CENTER); 
    txtviewExample.setTextColor(getResources().getColor(android.R.color.black)); 
    paramsExample.setMargins(20, 20, 20, 20); 
    txtviewExample.setPadding(20, 20, 20, 20); 
    txtviewExample.setTextSize(40); 
    txtviewExample.setText("customExample"); 

    //if I comment out the following line, this TextView displays. 
    //if I leave it in, it doesn't display. 
    txtviewExample.setLayoutParams(paramsExample); 
} 

Ich weiß, es gibt alle Arten von verfügbaren Klassen für LayoutParams, und ich habe mit ihnen alle LinearLayout.LayoutParams gespielt, TableView.LayoutParams, RelativeLayout.LayoutParams, LayoutParams einfach von selbst ... Egal, was ich versuche, jeder Versuch, "setLayoutParams" aufzurufen, macht die gesamte TextView weg. Ich habe die Foren hier durchforstet, und habe die Antwort nicht ganz gefunden. Das kann nicht so ungewöhnlich sein.

+4

Haben Sie versucht, 'TableRow.LayoutParams' http://developer.android.com/reference/android/widget/TableRow.LayoutParams.html –

+1

ich gerade getan hast, (vermisst Kommentar letzte Nacht, darnit) und es funktionierte. Danke mann – Octoth0rpe

+0

Sie sind willkommen :) –

Antwort

84

gut, das war schmerzhaft, aber ich habe endlich es herausgefunden. Die wichtigste Sache zu erinnern (die ich gerade realisiert habe) ist die aller Myriaden von LayoutParams, Sie müssen diejenige verwenden, die sich auf den PARENT der Ansicht bezieht, an der Sie arbeiten, nicht die tatsächliche Ansicht.

Also in meinem Fall habe ich versucht, die TextView Ränder arbeiten zu bekommen, aber es wurde in eine TableRow gelegt. Die eine einfache Änderung wurde sichergestellt wird, dass die Art der LayoutParams diejenigen für TableRow verwendeten waren:

private void buildTextView(){ 
    // the following change is what fixed it 
    TableRow.LayoutParams paramsExample = new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,1.0f); 
    txtviewExample.setId(textViewExampleID); 
    txtviewExample.setBackgroundResource(R.drawable.textview_9patch_white); 
    txtviewExample.setGravity(Gravity.CENTER); 
    txtviewExample.setTextColor(getResources().getColor(android.R.color.black)); 
    paramsExample.setMargins(20, 20, 20, 20); 
    txtviewExample.setPadding(20, 20, 20, 20); 
    txtviewExample.setTextSize(40); 
    txtviewExample.setText("customExample"); 
    txtviewExample.setLayoutParams(paramsExample); 
} 

Danke Jungs, hoffentlich wird dies als nützlich für jemand anderen auf der ganzen Linie, wie ich viel gesehen von Semi-verwandte Fragen in den Foren hier, aber nicht eine, die das Problem wirklich definiert.

+5

DANKE! Ich hatte das gleiche Problem, weil ich LinearLayout.LayoutParams anstelle von TableRow.LayoutParams verwendete ... dummer Fehler, aber Sie haben mich vor viel Frust gerettet! – RyanG

+0

Ich möchte nur Danke sagen! Du hast meinen Tag gerettet! – Zookey

+3

Für zwei Stunden habe ich versucht, das zu lösen. Danke mann. – arenaq

0

was ist die 3. Variable in LayoutParams soll tun, ist das Alpha? Was passiert, wenn Sie auskommen paramsExample.setMargins

endlich was passiert, wenn Sie txtviewExample.setVisible(View.Visible) nach Ihnen setLayoutParams?

diejenigen, die Dinge würde ich versuchen würde, wenn Sie nicht haben

+0

die dritte referenz im layoutparams ist für gewicht, gleichbedeutend mit der 'android: layout_weight =" 1.0 "' teil in der XML. und das '.setVisible (View.VISABLE);' hat nicht funktioniert. Trotzdem danke. – Octoth0rpe

+0

FWIW, Ich habe auch versucht, nicht 'txtviewExample.setLayoutParms (paramsExample);' und dann während der tatsächlichen addView im Layout, spe als sekundäre Parameter. Immer noch nicht funktioniert: 'tblrow.addView (txtviewExample, paramsExample);' – Octoth0rpe

+0

in 'setText' Ich nehme an, Sie haben eine tatsächliche String-Variable? Hat diese Variable irgendwelche Daten, wenn sie aufgerufen wird? – CQM

1
private TextView txtviewExample = new TextView(this); 

private void buildTextView(){ 
    LayoutParams paramsExample = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,1.0f); 
    txtviewExample.setId(textViewExampleID); 
    txtviewExample.setBackgroundResource(R.drawable.textview_9patch_white); 
    txtviewExample.setGravity(Gravity.CENTER); 
    txtviewExample.setTextColor(getResources().getColor(android.R.color.black)); 
    paramsExample.setMargins(20, 20, 20, 20); 
    txtviewExample.setPadding(20, 20, 20, 20); 
    txtviewExample.setTextSize(40); 
    txtviewExample.setText("customExample"); 

    setContentView(txtviewExample);//when you don't use SETTER method for TextView you can't view the desireable text on the UI// 
} 

// verwenden

+0

Verwenden Sie setContentView (txtviewExample), um Text auf dem UI-Bildschirm sichtbar zu machen – killer

+0

Kannst du nicht einfach nur eine Antwort geben, anstatt eine bereits beantwortete Frage zu beantworten? – NREZ

Verwandte Themen