Pomysł programowego ustawiania ograniczeń może być męczący. Poniższe rozwiązanie będzie działać dla dowolnego układu, czy to z ograniczeniami, liniowymi, itp. Najlepszym sposobem byłoby ustawienie symbolu zastępczego, tj. FrameLayout z odpowiednimi ograniczeniami (lub odpowiednie umieszczenie w innym układzie, np. Liniowym) w miejscu, w którym można oczekiwać, że utworzony programowo widok mieć.
Wszystko, co musisz zrobić, to programowo zawyżać widok i jako element podrzędny w stosunku do FrameLayout przy użyciu addChild()metody method. Wtedy podczas działania widok byłby zawyżony i umieszczony we właściwej pozycji. Zgodnie z zaleceniem systemu Android należy dodać tylko jeden widok podrzędny do FrameLayout [link] .
Oto jak wyglądałby Twój kod, zakładając, że chcesz programowo utworzyć TextView w określonej pozycji:
Krok 1:
W swoim układzie, który zawiera widok, który ma być zawyżony, umieść FrameLayout we właściwej pozycji i nadaj mu identyfikator, powiedzmy „kontener”.
Krok 2
Utwórz układ z elementem głównym jako widokiem, który chcesz rozszerzyć w czasie wykonywania, wywołaj plik układu jako „textview.xml”:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="match_parent">
</TextView>
Przy okazji, ustaw parametry układu twojego frameLayout na wrap_content, w przeciwnym razie układ ramki będzie tak duży jak rodzic, tj. Aktywność, tj. Ekran telefonu.
android:layout_width="wrap_content"
android:layout_height="wrap_content"
Jeśli nie jest ustawione, ponieważ widok podrzędny ramki domyślnie przechodzi do lewej górnej części układu ramki, dlatego widok po prostu przeleci do lewej górnej części ekranu.
Krok 3
W swojej metodzie oncreate wykonaj następujące czynności:
FrameLayout frameLayout = findViewById(R.id.container);
TextView textView = (TextView) View.inflate(this, R.layout.textview, null);
frameLayout.addView(textView);
(Zwróć uwagę, że ustawienie ostatniego parametru findViewByIddo nulli dodanie widoku przez wywołanie addView()widoku kontenera (frameLayout) jest tym samym, co zwykłe dołączenie powiększonego widoku przez przekazanie truetrzeciego parametru z findViewById(). Aby uzyskać więcej informacji, zobacz to ).