2012-03-23 14 views
6

I ein Layout mit 3 Fragmenten:Android erhält Fragment Breite

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

In dem ersten Fragmente I eine Tablelayout aufweisen, in der ich eine benutzerdefinierten Textview in jeder Reihe aufweisen. Ich mag die Breite des Fragments wissen, weil, wenn die benutzerdefinierte Textview breiter als das Fragment ist, werde ich die Anzahl der Zeilen erforderlich gesetzt.

Dies ist, was ich in meiner benutzerdefinierten Textview getan habe:

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

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

Mit dieser Linie ich die Breite von den Fragmenten drei bekam, nicht nur die eine, die die benutzerdefinierte Textview enthält.

Danke.

Antwort

25

Sie sollten die Breite des Textview einstellen können, werden fill_parent, in diesem Fall ist es für Sie, die Verpackung tun. Sie sollten die Breiten Ihrer Layouts nicht auf "match_parent" festlegen, da dies ineffizient ist, wenn Sie Layout-Gewichtungen verwenden.

Da Layoutsystem Android gelegentlich mysteriös ist in Bezug Größen sehen können, wenn das Textview-Breite Einstellung fill_parent werden macht es dauern, bis tatsächlich den ganzen Bildschirm (wie Ihre Frage impliziert zu sein scheint) wie folgt vor:

Setzen Sie Ihre TextView-Breite standardmäßig auf 0. In onCreate Ihre Tätigkeit, nachdem die Seiteneinstellung:

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

durch die Textview Breite auf 0 zunächst einstellen, verhindern Sie es von der Breite der Fragmente zu verändern. Dann können Sie einen Blick Baum Beobachter verwenden, um die Breite zu bekommen, was auch immer Fragment Sie Interesse an (von an seiner Wurzel Ansicht suchen) nach Layout aufgetreten ist. Schließlich können Sie Ihre TextView auf diese exakte Breite einstellen, die wiederum automatisch für Sie umbricht.

Beachten Sie, dass onGlobalLayout kann mehrfach und wird regelmäßig aufgerufen aufgerufen werden, bevor alle Ansichten vollständig angelegt worden, daher auch der! = 0 überprüfen. Sie wollen auch wahrscheinlich irgendeine Art von Kontrolle zu tun, um sicherzustellen, dass Sie nur die Breite der Textansicht einmal gesetzt, oder sonst kann man in eine unendliche Layout Schleife bekommt (nicht das Ende der Welt, aber nicht gut für die Leistung) .

+0

Fantastische Touch Monkeyless !. Es hat perfekt funktioniert. Ich habe so viel Zeit damit verbracht, die Lösung meiner Frage zu suchen. Danke vielmals. Grosses Wissen!. – gutiory

+0

+1 nette Antwort. – Dharmendra

+0

Ich habe diesen Listener hinzugefügt und er gibt mir die Breite und Höhe meines Fragments, aber es zeichnet meinen Inhalt nicht auf den Bildschirm, also können Sie mit diesem Problem helfen –