Ich möchte ein 2x2-Raster mit Schaltflächen im Inneren haben. Dies ist nur ICS, daher versuche ich, das neue GridLayout zu verwenden.
Hier ist das XML meines Layouts:
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/favorites_grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00ff00"
android:rowCount="2"
android:columnCount="2">
<Button
android:text="Cell 0"
android:layout_row="0"
android:layout_column="0"
android:textSize="14dip" />
<Button
android:text="Cell 1"
android:layout_row="0"
android:layout_column="1"
android:textSize="14dip" />
<Button
android:text="Cell 2"
android:layout_row="1"
android:layout_column="0"
android:textSize="14dip" />
<Button
android:text="Cell 3"
android:layout_row="1"
android:layout_column="1"
android:textSize="14dip" />
</GridLayout>
Das Problem ist, dass sich meine Ansichten nicht für jede Zeile gleichmäßig erstrecken. Dies verursacht viel zusätzlichen Platz rechts von meinem GridLayout.
Ich habe versucht einzustellen, layout_gravity="fill_horizontal"
aber das gilt nur für die letzte Ansicht in der Zeile. Dies bedeutet, dass sich Zelle 1 bis zum Ende erstreckt, um genügend Platz für Zelle 0 zu schaffen.
Gedanken darüber, wie man das angeht?
Antworten:
UPDATE : Gewichte werden ab API 21 unterstützt. Weitere Informationen finden Sie in der Antwort von PaulT . END UPDATE Bei der Verwendung des GridLayout gibt es Einschränkungen. Das folgende Zitat stammt aus der Dokumentation .
Hier ist ein kleines Beispiel, das LinearLayout-Unteransichten verwendet. (Ich habe Space Views verwendet, die nicht genutzten Bereich einnehmen und die Tasten in die gewünschte Position drücken.)
quelle
Ab API 21 wurde der Gewichtsbegriff zu GridLayout hinzugefügt. Um ältere Android-Geräte zu unterstützen, können Sie das GridLayout aus der v7-Unterstützungsbibliothek verwenden.
Das folgende XML enthält ein Beispiel dafür, wie Sie Gewichte verwenden können, um die Bildschirmbreite auszufüllen.
quelle
FrameLayout
die eineButton and an
ImageView enthielt (um ein Symbol auf einer Schaltfläche zu überlagern, die beim Berühren visuelles Feedback zeigte ... lange Geschichte) als Teil einer Tastatur verwenden musste. Das EinstellencolumnWeight
undgravity
bei jedem anderenButton
funktionierte gut, brach aber amFrameLayout
. Lassen Sie es nur für dieFrameLayout
gemacht alles alles gleichmäßig wie erwartet angelegt.Appcompat21 GridLayout verfügt über die Spalten- und Zeilengewichte, die wie unten verwendet werden können, um jedes Rasterelement im Rasterlayout wie im obigen Bild gleichmäßig zu erstellen.
quelle
compile "com.android.support:gridlayout-v7:$supportVersion"
app:columnCount="2"
) zugreifen zu können :xmlns:app="http://schemas.android.com/apk/lib/android.support.v7.widget.GridLayout"
Ab API 21 ohne v7-Unterstützungsbibliothek mit ScrollView:
XML:
quelle
Sie können die Breite jedes Kindes dynamisch einstellen:
quelle
useDefaultMargins="true"
- funktioniert perfekt mit ihnen eingestelltfalse
Fügen Sie Ihrer GridLayout-Spezifikation Folgendes hinzu. Das sollte funktionieren.
quelle
Das ist die richtige Antwort
quelle
Ich habe endlich die Lösung gefunden. Wie Rotemmiz sagte, muss man es danach dynamisch machen. Dieser Code streckt die Schaltflächen, um die Ansicht horizontal auszufüllen. Dies kann jedoch auch vertikal erfolgen.
(Die 20 ist für die interne und externe Polsterung und die Ränder. Dies könnte universeller erfolgen, ist aber weitaus sauberer.)
Dann kann es so genannt werden:
Dies muss mit einem Beobachter geschehen, da wir warten müssen, bis die Ansicht gezeichnet ist, bevor wir die Ansichten aufrufen.
quelle
In meinem Fall habe ich die Schaltflächen dynamisch hinzugefügt, sodass für meine Lösung ein XML-Teil und ein Java-Teil erforderlich waren. Ich musste Lösungen von verschiedenen Orten finden und mischen und dachte, ich werde sie hier teilen, damit jemand anderes, der nach einer ähnlichen Lösung sucht, sie möglicherweise hilfreich findet.
Erster Teil meiner Layoutdatei XML ...
grid:useDefaultMargins="true"
ist nicht erforderlich, aber ich habe hinzugefügt, da dies für mich besser aussah. Sie können andere visuelle Effekte (z. B. Polsterung) anwenden, wie in einigen Antworten hier erwähnt. Nun zu den Schaltflächen, da ich sie dynamisch hinzufügen muss. Hier ist der Java-Teil meines Codes, um diese Schaltflächen zu erstellen. Ich füge nur die Zeilen hinzu, die sich auf diesen Kontext beziehen. Angenommen, ich muss SchaltflächenmyOptions
erstellen , von denen so viele für meinen Code verfügbar sind, und ich kopiere auch nicht den OnClickListener-Code.Da wir GridLayout aus der Support-Bibliothek und nicht das Standard-GridLayout verwenden, müssen wir dies in der
YourProject.grade
Datei angeben .quelle
Sie können dies erheblich beschleunigen, indem Sie die ViewGroup onLayout-Methode überschreiben. Dies ist meine universelle Lösung:
EDIT: Match_parent für Kinder nicht vergessen!
quelle
getChildAt(i).layout(viewWidth * columnIndex + margin, viewHeight * rowIndex + margin, viewWidth * columnIndex + viewWidth - margin, viewHeight * rowIndex + viewHeight - margin);
Die beste Lösung, die ich finden konnte, besteht darin, für jede gewünschte Zeile ein lineares Layout (horizontal) zu verwenden und darin die Breite der Schaltfläche (Zelle) 0 dp und das Gewicht 1 zuzuweisen. Weisen Sie für jedes der linearen Layouts (Zeilen) die Höhe zu bis 0dp und das Gewicht bis 1. Finden Sie den Code unten - auch android: layout_gravity = "center_vertical" wird verwendet, um die Schaltflächen in einer Reihe auszurichten, falls sie Text variabler Länge enthalten. Verwendung von 0dp und Gewicht ist ein ziemlich ordentlicher, aber nicht so bekannter Trick.
quelle
Hier sind Sie ja :
quelle
Ich wollte eine zentrierte Tabelle mit rechtsbündigen und linksbündigen Beschriftungen. Der zusätzliche Platz sollte um den Tisch herum sein. Nachdem ich viel experimentiert und nicht den Anweisungen der Dokumentation gefolgt war, kam ich auf etwas, das funktioniert. Folgendes habe ich getan:
Dies scheint zu funktionieren, aber das GridLayout zeigt die folgende Meldung an:
"Dieses GridLayout-Layout oder sein übergeordnetes LinearLayout-Layout ist nutzlos."
Ich bin mir nicht sicher, warum es "nutzlos" ist, wenn es bei mir funktioniert.
Ich bin mir nicht sicher, warum dies funktioniert oder ob dies eine gute Idee ist, aber wenn Sie es versuchen und eine bessere Idee, eine kleine Verbesserung oder eine Erklärung dafür liefern können, warum es funktioniert (oder nicht funktioniert), würde ich mich über das Feedback freuen.
Vielen Dank.
quelle
Dies ist eine ziemlich alte Frage, die aber offensichtlich für viele Menschen von Interesse ist. Für ein einfaches Layout von 4 Schaltflächen wie dieser scheint ein TableLayout der einfachste Weg zu sein, um das gewünschte Ergebnis zu erzielen.
Hier ist ein Beispielcode, der die ersten 2 Zeilen einer Tabelle mit 6 Spalten zeigt, die sich über die Breite des übergeordneten Elements erstrecken. Das LinearLayout und ImageView in jeder Zelle werden verwendet, um das "Ein- und Ausschalten" eines Bildes in der Zelle zu ermöglichen, während die Farbe der Zelle erhalten bleibt.
quelle
Alte Frage, wollte aber meine Lösung hinzufügen. Ich habe ein "lineares Rasterlayout" erstellt, das ein Raster simuliert, aber verschachtelte lineare Layouts verwendet. Dadurch kann es sich dehnen, um den Raum auszufüllen.
quelle
Ich wünschte, das hilft jemandem
Ergebnis
Code:
quelle
Ergebnis:
Versuchen Sie so etwas:
Wenn Sie eine bestimmte Breite und Höhe für Ihre Zellen wünschen, verwenden Sie:
quelle
Dies ist der Code für mehr Standardanwendungen ohne die Schaltflächen. Dies ist sehr praktisch für mich
quelle
Ich habe das gleiche Problem und ich denke, nur Breite und Höhe programmgesteuert einstellen:
Das Festlegen der Breite von Schaltflächen mit Metriken.widthPixels / 2-Metriken ist Gegenstand von DisplayMetrics.
quelle
Die gesamten Tutorials finden Sie hier, Android Grid Layout With CardView und OnItemClickListener
quelle
Hier ist, was ich getan habe und ich bin froh zu sagen, dass dies für mich funktioniert hat. Ich wollte auch ein 2x2, 3x3 usw. Raster von Elementen, um den gesamten Bildschirm abzudecken. Rasterlayouts halten sich nicht an die Bildschirmbreite. LinearLayouts funktionieren, aber Sie können keine verschachtelten Gewichte verwenden.
Die beste Option für mich war, Fragmente zu verwenden, die ich verwendet habe Tutorial verwendet, um mit dem zu beginnen, was ich tun wollte.
Hier ist ein Code:
Hauptaktivität:
activity_main_6 XML (bläst 3 Fragmente auf)
Basisfragment-Layout
Die Fragmentklasse (behandelt nur die Initialisierung einer benutzerdefinierten Ansicht) bläst 2 Kacheln pro Fragment auf
}}
Das ist es!
Dies ist im Wesentlichen eine seltsame Umgehung der Verwendung verschachtelter Gewichte. Es gibt mir ein perfektes 2x3-Raster, das den gesamten Bildschirm sowohl meines 10-Zoll-Tablets als auch meiner HTC-Droiden-DNA ausfüllt. Lass mich wissen, wie es dir geht!
quelle