2013-05-15 2 views
13

Sto provando a impostare un layout per textview in modo da poter utilizzare il metodo getEllipsisCount(). Ma sotto il codice restituisce null come valore di layout. Come posso prendere il layout e quindi utilizzare il metodo getEllipsisCount(0).Come usare textview.getLayout()? Restituisce nulla

public class MainActivity extends Activity { 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    TextView mytextview =(TextView) findViewById(R.id.textView1); 
    mytextview.setText(myText); 

     Layout layout = mytextview.getLayout(); 
     if(layout != null){ 
      mytextview.settext("very good layout worked\n"); 
     } 

} 
+0

Penso che non si possa chiamare questo metodo prima che il metodo 'onCreate' sia completo. –

risposta

24

Si sta chiamando troppo presto, ecco perché si sta tornando null

Prova questa

ViewTreeObserver vto = mytextview.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      Layout layout = mytextview.getLayout(); 
     } 
    }); 
+0

grazie ho lavorato –

+2

Vale la pena notare che getLayout può ancora restituire null anche all'interno di onGlobalLayout. Sfortunatamente dovrai capire come gestirlo nel tuo codice. –

+6

Ho trovato un modo per aggirare il fatto che getLayout() potrebbe essere nullo anche dopo il layout globale: utilizzo invece addOnPreDrawListener() e ascolto restituendo true finché getLayout() non inizia a restituire true e solo allora lo uso, chiama removeOnPreDrawListener() e restituire false da questo listener di pre draw per causare un relayout – dimsuz

0

chiamata mytextview.getLayout() in onStart o onResume callback.

0

In primo luogo, non so se si tratta di un errore di battitura o è intenzionale ma è stato dichiarato un metodo "settext" anziché lo setText predefinito. Tuttavia per ottenere un riferimento del layout vi consiglio il seguente:

LayoutInflater inflater = getLayoutInflater(); 

RelativeLayout textViewLayout = (RelativeLayout) inflater.inflate(R.layout.activity_main,null); 

if (textViewLayout != null) { 
    mytextview.setText("very good layout worked\n"); 
} 

supponendo che il vostro TextView appartiene a una RelativeLayout.

2

Dal documentation:

pubblico layout finale getLayout()

Aggiunto a livello di API 1 Ritorna il layout che viene attualmente utilizzato per visualizzare il testo. Questo può essere nullo se il testo o la larghezza ha subito modifiche .

Quindi probabilmente il testo ha delle modifiche o lo chiamate troppo presto.

Guardate questa answer in cui è riportata

Questo funziona solo dopo la fase di layout, altrimenti il ​​layout tornato sarà nullo, in modo da chiamare questo in un luogo appropriato nel codice.

+1

gipi, si prega di utilizzare le virgolette per citare, non le etichette del codice;) Risolto il problema per voi. – RvdK

+0

grazie @RvdK, :) – gipi

1

chiamata

TextView.onPreDraw(); 

Esso crea il layout.

+1

fornire maggiori dettagli o codice di esempio per quanto riguarda la domanda posta. –