2012-03-23 17 views
6

devo un layout con 3 frammenti:Android ottenere Frammento larghezza

<LinearLayout android:id="@+id/acciones" 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal"> 

<LinearLayout 
android:id="@+id/fragment1" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_weight="1"> 

</LinearLayout> 


<LinearLayout 
android:id="@+id/fragment2" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_weight="1"> 

</LinearLayout> 

<LinearLayout 
android:orientation="vertical" 
android:id="@+id/f3" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:layout_weight="1"> 

</LinearLayout> 

</LinearLayout> 

Nel primo frammento Ho una TableLayout in cui ho un TextView personalizzate in ciascuna riga. Voglio conoscere la larghezza del frammento perché se il TextView personalizzato è più largo del frammento, imposterò il numero di linee necessarie.

Questo è quello che ho fatto nella mia TextView personalizzato:

@Override 
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) { 
super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

mMaxWidth = (float) (getMeasuredWidth()); 
} 

Con questa formazione ho avuto la larghezza da tre frammenti, non solo quella che contiene il TextView personalizzato.

Grazie.

risposta

25

Dovresti essere in grado di impostare la larghezza del TextView come fill_parent, nel qual caso farà il wrapping per te. Non dovresti impostare la larghezza dei tuoi layout per essere match_parent dato che è inefficiente quando stai usando i pesi di layout.

Dal sistema di layout di Android è di tanto in tanto misterioso per quanto riguarda visualizzare le dimensioni, se l'impostazione della larghezza di TextView da fill_parent rende effettivamente occupano l'intero schermo (come appare la tua domanda per essere implicando) procedere come segue:

Imposta la larghezza di TextView su 0 per impostazione predefinita. In onCreate della vostra attività, dopo aver impostato la visualizzazione del contenuto:

findViewById(R.id.acciones).getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     final int fragmentWidth = findViewById(R.id.releventFragmentId).getWidth(); 
     if (fragmentWidth != 0){ 
      findViewById(R.id.yourTextViewId).getLayoutParams().width = fragmentWidth; 
     } 
    } 
}); 

Impostando la larghezza della TextView a 0 inizialmente, si evita che il cambiare le larghezze dei frammenti. Quindi puoi usare un osservatore di viste per ottenere la larghezza di qualunque frammento ti interessi (osservando la sua vista di root) dopo che si è verificato il layout. Finalmente puoi impostare il tuo TextView con quella larghezza esatta, che a sua volta farà automaticamente il wrapping per te.

Nota che onGlobalLayout può essere chiamato più volte e viene chiamato regolarmente prima che tutte le viste siano state completamente disposte, quindi il controllo! = 0. Probabilmente vorrai anche fare qualche tipo di controllo per assicurarti di impostare solo la larghezza della vista del testo una volta, o altrimenti puoi entrare in un ciclo di layout infinito (non alla fine del mondo, ma non buono per le prestazioni) .

+0

Un tocco fantastico Monkeyless !. Ha funzionato perfettamente. Ho passato così tanto tempo a cercare la soluzione della mia domanda. Molte grazie. Grande conoscenza !. – gutiory

+0

+1 bella risposta. – Dharmendra

+0

Ho aggiunto questo listener e mi dà la larghezza e l'altezza del mio frammento, ma non disegna il mio contenuto sullo schermo, quindi puoi aiutare con questo problema –

Problemi correlati