Staram się osiągnąć następujące programowo (zamiast deklaratywnie poprzez XML):
<RelativeLayout...>
<TextView ...
android:id="@+id/label1" />
<TextView ...
android:id="@+id/label2"
android:layout_below: "@id/label1" />
</RelativeLayout>
Innymi słowy, jak sprawić, aby drugi TextView
pojawił się poniżej pierwszego, ale chcę to zrobić w kodzie:
RelativeLayout layout = new RelativeLayout(this);
TextView label1 = new TextView(this);
TextView label2 = new TextView(this);
...
layout.addView(label1);
layout.addView(label2);
setContentView(layout);
Aktualizacja:
Dzięki, TreeUK. Rozumiem ogólny kierunek, ale nadal nie działa - „B” nakłada się na „A”. Co ja robię źle?
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);
Odpowiedzi:
Z tego, co udało mi się połączyć, musisz dodać widok za pomocą LayoutParams.
Wszystkie zasługi dla sechastain, aby względnie programowo pozycjonować swoje przedmioty, musisz przypisać im identyfikatory.
Następnie
addRule(RelativeLayout.RIGHT_OF, tv1.getId());
źródło
below
został już dodany, jak upewnić się, że nadal renderuje prawidłowo? Z mojego zrozumieniaaddView
wynika, że układ renderuje się ponownie, więc jeśli zrobię to dla elementu, którego krewny nie został jeszcze dodany, ulegnie awarii, ponieważ element o tym identyfikatorze jeszcze nie istnieje.Krótko mówiąc: dzięki względnemu układowi umieszczasz elementy wewnątrz układu.
utwórz nowy RelativeLayout.LayoutParams
(cokolwiek ... wypełnij treść nadrzędną lub opakuj, liczby bezwzględne, jeśli musisz lub odwołanie do zasobu XML)
Dodaj reguły: reguły odnoszą się do rodzica lub innych „braci” w hierarchii.
Wystarczy zastosować parametry układu: najbardziej „zdrowym” sposobem na to jest:
Uwaga : nie zmieniaj układu z wywołania zwrotnego układu. Jest to kuszące, ponieważ wtedy widoki uzyskują swoje rzeczywiste rozmiary. Jednak w takim przypadku oczekuje się nieoczekiwanych wyników.
źródło
parentLayout.addView(myView, lp
). Zawsze robiłem to w dwóch liniach kodu. Dziękuję Ci!Właśnie spędziłem 4 godziny z tym problemem. Wreszcie zdałem sobie sprawę, że nie wolno używać zera jako identyfikatora widoku . Można by pomyśleć, że jest to dozwolone jako NO_ID == -1, ale rzeczy mają tendencję do szaleństwa, jeśli podasz to do swojego widoku ...
źródło
Przykład minimalnego uruchomienia Androida 22
Źródło:
Działa z domyślnym projektem wygenerowanym przez
android create project ...
. Repozytorium GitHub z minimalnym kodem kompilacji .źródło
TextView
? Próbowałem, a trzeciegoTextView
brakuje.połączenie
po
źródło
Próbować:
źródło
Takie podejście z ViewGroup.MarginLayoutParams działało dla mnie:
źródło
źródło
Jeśli naprawdę chcesz układać ręcznie, radzę w ogóle nie używać standardowego układu. Zrób to sam, oto przykład kotlina:
To może dać ci wyobrażenie, jak to może działać
źródło