Ich versuche, programmgesteuert (und nicht deklarativ über XML) Folgendes zu erreichen:
<RelativeLayout...>
<TextView ...
android:id="@+id/label1" />
<TextView ...
android:id="@+id/label2"
android:layout_below: "@id/label1" />
</RelativeLayout>
Mit anderen Worten, wie kann ich die zweite TextView
unter der ersten anzeigen lassen, aber ich möchte dies im Code tun:
RelativeLayout layout = new RelativeLayout(this);
TextView label1 = new TextView(this);
TextView label2 = new TextView(this);
...
layout.addView(label1);
layout.addView(label2);
setContentView(layout);
Aktualisieren:
Danke, TreeUK. Ich verstehe die allgemeine Richtung, aber es funktioniert immer noch nicht - "B" überlappt "A". Was mache ich falsch?
RelativeLayout layout = new RelativeLayout(this);
TextView tv1 = new TextView(this);
tv1.setText("A");
TextView tv2 = new TextView(this);
tv2.setText("B");
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT);
lp.addRule(RelativeLayout.RIGHT_OF, tv1.getId());
layout.addView(tv1);
layout.addView(tv2, lp);
Antworten:
Nach dem, was ich zusammensetzen konnte, müssen Sie die Ansicht mit LayoutParams hinzufügen.
Alle Kredite an sechastain. Um Ihre Artikel relativ programmgesteuert zu positionieren, müssen Sie ihnen IDs zuweisen.
Dann
addRule(RelativeLayout.RIGHT_OF, tv1.getId());
quelle
below
bereits hinzugefügt wurde, um sicherzustellen, dass es weiterhin gerendert wird korrekt? Nach meinem VerständnisaddView
wird das Layout neu gerendert. Wenn ich es also für ein Element mache, dessen Verwandter noch nicht hinzugefügt wurde, stürzt es ab, da ein Element mit dieser ID noch nicht vorhanden ist.Um es kurz zu machen: Mit dem relativen Layout positionieren Sie Elemente innerhalb des Layouts.
Erstellen Sie ein neues RelativeLayout.LayoutParams
(Was auch immer ... übergeordneten oder umschließenden Inhalt, absolute Zahlen, falls erforderlich, oder Verweis auf eine XML-Ressource)
Regeln hinzufügen: Regeln beziehen sich auf die Eltern oder andere "Brüder" in der Hierarchie.
Wenden Sie einfach die Layout-Parameter an: Der "gesündeste" Weg, dies zu tun, ist:
Achtung : Ändern Sie das Layout nicht aus den Layout-Rückrufen. Dies ist verlockend, da die Ansichten dann ihre tatsächliche Größe erhalten. In diesem Fall werden jedoch unerwartete Ergebnisse erwartet.
quelle
parentLayout.addView(myView, lp
). Ich habe das immer in zwei Codezeilen gemacht. Danke dir!Ich habe gerade 4 Stunden mit diesem Problem verbracht. Endlich wurde klar, dass Sie nicht Null als Ansichts-ID verwenden dürfen . Sie würden denken, dass es als NO_ID == -1 erlaubt ist, aber die Dinge neigen dazu, durcheinander zu kommen, wenn Sie es Ihrer Ansicht geben ...
quelle
Android 22 minimal lauffähiges Beispiel
Quelle:
Funktioniert mit dem Standardprojekt, das von generiert wurde
android create project ...
. GitHub-Repository mit minimalem Build-Code .quelle
TextView
? Ich habe es versucht und der dritteTextView
fehlt.Anruf
nach dem
quelle
Versuchen:
quelle
Dieser Ansatz mit ViewGroup.MarginLayoutParams hat bei mir funktioniert:
quelle
quelle
Wenn Sie wirklich manuell gestalten möchten, würde ich empfehlen, überhaupt kein Standardlayout zu verwenden. Mach alles alleine, hier ein Kotlin-Beispiel:
Dies könnte Ihnen eine Vorstellung davon geben, wie dies funktionieren könnte
quelle