Benutzerdefinierte Ansichtsgruppe für Zeilenumbruch-Layout
Problem:
Sie müssen eine erstellen Layout, das mehrere Widgets auf umschließbare Weise darstellt und sie bei Bedarf in Zeilen unterteilt, um sie an den verfügbaren Platz anzupassen. Den standardmäßigen ViewGroup-Komponenten fehlt diese Funktionalität.
Lösung:
Um einen Zeilenumbruch zu erreichen, können Sie eine benutzerdefinierte ViewGroup erstellen. So geht's:
Untergeordnete Elemente messen:
Berechnen Sie in onMeasure() die verfügbare Breite und durchlaufen Sie die untergeordneten Ansichten. Messen Sie für jedes Kind seine Breite und Höhe. Aktualisieren Sie die Zeilenhöhe, um die maximale Höhe jedes untergeordneten Elements in einer bestimmten Zeile darzustellen.
Zeilenumbrüche bestimmen:
Überprüfen Sie während der Messung, ob die Die kumulierte Breite der untergeordneten Ansichten überschreitet die verfügbare Breite. Wenn dies der Fall ist, setzen Sie die Breite zurück und erhöhen Sie die Ypos auf die nächste Zeile.
Layoutparameter festlegen:
GenerateDefaultLayoutParams() und checkLayoutParams überschreiben (), um Ihre benutzerdefinierten Layoutparameter zu definieren. Diese Parameter können beispielsweise den Abstand zwischen Widgets angeben.
Layout untergeordneter Ansichten:
Iterieren Sie in onLayout() erneut durch untergeordnete Ansichten und Positionieren Sie sie basierend auf den gemessenen Abmessungen und den Variablen xpos und ypos. Aktualisieren Sie xpos, wenn Sie der Zeile Widgets hinzufügen.
Bereitstellung von XML-Attributunterstützung:
Erstellen Sie ein benutzerdefiniertes XML-Attribut, um die Layoutparameter verfügbar zu machen. Dadurch können Sie sie in Ihren Layout-XML-Dateien angeben.
Beispielimplementierung:
public class PredicateLayout extends ViewGroup { private int line_height; public PredicateLayout(Context context) { super(context); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // Calculate available width // Iterate through child views and measure them if (xpos + childw > width) { xpos = getPaddingLeft(); ypos += line_height; } ... } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { for (int i = 0; i < count; i++) { if (xpos + childw > width) { xpos = getPaddingLeft(); ypos += line_height; } // Position the child view } } }
Durch die Verwendung dieses benutzerdefinierten Layouts können Sie dies tun Erzielen Sie das gewünschte Wrapping-Verhalten für Ihre Widgets.
Das obige ist der detaillierte Inhalt vonWie erstelle ich eine benutzerdefinierte ViewGroup für Layouts mit Zeilenumbruch?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!