2012-08-15 19 views
22

L'ho colpito da diversi angoli. Fondamentalmente il succo è questo:android: LayoutParams per TextView fa scomparire la vista, a livello di programmazione

Ho disposto un modello in XML per un'interfaccia che DEVE essere eseguita a livello di codice, quindi verrà popolata dinamicamente durante la corsa.

Il problema qui è che XML TextView presenta alcune modifiche al layout (che funzionano) e sono necessarie. Ma se li metto effettivamente in codice, il TextView non viene nemmeno visualizzato.

(Il TextView, tra l'altro, è annidato all'interno di un TableRow, quindi la chiamata al peso.) Il modello XML ho progettato prima, da utilizzare come riferimento per il codice è questo, e funziona bene:

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

Come ho detto, che si staglia perfettamente. Tuttavia, quando eseguo lo stesso layout nel codice e applico LayoutParams, TextView scompare.

Ecco il frammento di rilevante:

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); 
} 

Mi rendo conto che ci sono tutti i tipi di classi disponibili per LayoutParams, e ho giocato con loro tutti i LinearLayout.LayoutParams, TableView.LayoutParams, RelativeLayout.LayoutParams, LayoutParams da solo ... Non importa quale cerco, qualsiasi tentativo di chiamare "setLayoutParams" rende tutto il TextView andato. Ho setacciato i forum qui, e non ho ancora trovato la risposta. Questo non può essere così raro.

+4

Hai provato 'TableRow.LayoutParams' http://developer.android.com/reference/android/widget/TableRow.LayoutParams.html –

+1

ho appena fatto, (perso questo commento ieri sera, Darnit) e ha funzionato. Grazie uomo – Octoth0rpe

+0

Siete i benvenuti :) –

risposta

84

bene, che è stato doloroso, ma ho finalmente capito capito. La cosa più importante da ricordare (che ho appena realizzato) è che tra tutte le miriadi di LayoutParams, devi usare quella che si riferisce al PARENT della vista su cui stai lavorando, non la vista attuale.

Quindi nel mio caso, stavo cercando di ottenere i margini TextView funzionanti, ma era stato inserito in un TableRow. Quella semplice cambiamento era garantire che il tipo di LayoutParams in uso erano quelli per TableRow: ragazzi

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); 
} 

Grazie, speriamo che questo sarà utile per qualcun altro su tutta la linea, come ho visto un sacco di domande semi-correlate nei forum qui, ma non quella che definisce veramente il problema.

+5

GRAZIE! Avevo lo stesso problema, era perché stavo usando LinearLayout.LayoutParams invece di TableRow.LayoutParams ... errore stupido ma mi hai salvato da un sacco di frustrazione! – RyanG

+0

Voglio solo dire grazie! Mi hai salvato la giornata! – Zookey

+3

Per due ore ho provato a risolvere questo. Grazie amico. – arenaq

0

Qual è la terza variabile nel layoutparams dovrebbe fare, è quella alfa? cosa succede se si commenta paramsExample.setMargins

infine cosa succede se si a txtviewExample.setVisible(View.Visible) dopo il setLayoutParams?

quelli sarebbero le cose che vorrei provare se non l'hai

+0

il terzo riferimento nel layoutparams è per il peso, equivalente a 'android: layout_weight =" 1.0 "' parte nell'XML. e '.setVisible (View.VISABLE);' non ha funzionato. Grazie comunque. – Octoth0rpe

+0

FWIW, ho anche provato a non utilizzare 'txtviewExample.setLayoutParms (paramsExample);' e quindi durante l'effettivo addView nel layout, lo spec come parametro secondario. Ancora non ha funzionato: 'tblrow.addView (txtviewExample, paramsExample);' – Octoth0rpe

+0

in 'setText' Suppongo che tu abbia una variabile stringa effettiva? questa variabile ha dei dati quando viene chiamata? – 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// 
} 

// utilizzare

+0

usa setContentView (txtviewExample) per rendere il testo visibile sullo schermo dell'interfaccia utente – killer

+0

Non puoi semplicemente commentare invece di rispondere ad una domanda già risposta ..? – NREZ