Ich habe 2 Spalten in meinem GridLayout
. Was ich tun möchte, ist, dass diese Spalten jeweils die Hälfte der Bildschirmbreite einnehmen und dann ihre untergeordneten Inhalte die Breite/Höhe ihrer eigenen Zellen füllen. Ich habe versucht, die Kinder auf fill_parent
zu setzen, aber das führt nur dazu, dass der erste die gesamte Layout übernimmt. Und es scheint, dass GridLayout weight
nicht unterstützt? Vielleicht gibt es ein besseres Layout, das verwendet werden kann, aber ich möchte ein Rasterlayout verwenden, also scheint das die natürliche Wahl zu sein.
Antworten
Zu viele Anzeigen?Dieser Code ist auf Pre-API21 mit Support-Bibliothek verfügbar!
Ich habe ein einfaches Stück Code, um 4 Buttons in einem Rasterlayout mit 2 Spalten anzuzeigen, die 50% des verfügbaren Platzes einnehmen: vielleicht kann es helfen
Die Lösung ist vielleicht diese:
android:layout_gravity="fill"
android:layout_columnWeight="1"
Für vor API 21, verwenden Sie die Support-Bibliothek:
fügen Sie hinzu
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
zu Ihren Abhängigkeiten.
Dann in Ihrer XML-Datei:
Hier beachten Sie die Verwendung des "app" Präfix und vergessen Sie nicht hinzuzufügen
xmlns:app="http://schemas.android.com/apk/res-auto"
zu Ihrer XML-Datei
Das Hinzufügen von Ansichten dynamisch in einem Rasterlayout mit 2 Spalten, die 50% des verfügbaren Platzes einnehmen:
GridLayout gridLayout = new GridLayout();
View view; //es kann jede Ansicht sein
GridLayout.LayoutParams param = new GridLayout.LayoutParams();
param.columnSpec = GridLayout.spec(GridLayout.UNDEFINED,GridLayout.FILL,1f);
param.width = 0;
view.setLayoutParams(param);
gridLayout.add(view);
auf statische Weise (in der .xml-Datei).
Ok, also habe ich die Rasteransicht aufgegeben und stattdessen lineare Layouts verwendet. Ich habe ein vertikales erstellt und dann 2 horizontale hinzugefügt. Es ist etwas aufwändiger als die Rasteransicht... aber bis ich das herausfinde, funktioniert das zumindest.
Und dann füge ich das hinzu, um die Buttons quadratisch zu machen :)
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
btnPrefs.setMinimumHeight(btnPrefs.getWidth());
btnVerse.setMinimumHeight(btnMyButton.getWidth());
}
Sie könnten die RelativeLayout-Klasse erweitern (oder LinearLayout verwenden, wenn Sie möchten), um sicherzustellen, dass die Höhe des Elements gleich der Höhe ist.
public class GridItem extends RelativeLayout {
public GridItem(Context context) {
super(context);
}
public GridItem(Context context, AttributeSet attr) {
super(context, attr);
}
public GridItem(Context context, AttributeSet attr, int integer) {
super(context, attr, integer);
}
// Überschreiben Sie onMeasure, um der Ansicht die gleiche Höhe wie die angegebene Breite zu geben
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, widthMeasureSpec);
setMeasuredDimension(getMeasuredWidth(), getMeasuredWidth());
}
}
Die Elternansicht des Element-Layouts sollte die GridItem-Ansicht sein, um sicherzustellen, dass es funktioniert. Dies muss die Layoutdatei sein, die Sie in getView Ihres ListAdapter aufblasen werden.
Und setzen Sie den stretchMode des GridView auf columnWidth. Dadurch passen alle Elemente in die Breite der angegebenen Anzahl von Spalten. Die neue Ansicht stellt sicher, dass sie auch die gleiche Höhe haben.
- See previous answers
- Weitere Antworten anzeigen