L'idea di impostare i vincoli a livello di programmazione può essere noiosa. Questa soluzione di seguito funzionerà per qualsiasi layout sia vincolo, lineare, ecc. Il modo migliore sarebbe quello di impostare un segnaposto, ad esempio un FrameLayout con vincoli adeguati (o il posizionamento corretto in altri layout come lineare) nella posizione in cui ci si aspetterebbe la vista creata programmaticamente avere.
Tutto quello che devi fare è gonfiare la vista a livello di codice e da bambino a FrameLayout usando il addChild()metodo Quindi durante il runtime la tua vista verrebbe gonfiata e posizionata nella giusta posizione. Secondo i consigli di Android, è necessario aggiungere solo un childView a FrameLayout [link] .
Ecco come sarebbe il tuo codice, supponendo che desideri creare TextView a livello di programmazione in una posizione particolare:
Passo 1:
Nel layout che contiene la vista da gonfiare, posizionare un FrameLayout nella posizione corretta e dargli un ID, ad esempio "contenitore".
Passaggio 2
Creare un layout con l'elemento radice come vista che si desidera gonfiare durante il runtime, chiamare il file di layout come "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>
A proposito, imposta i parametri di layout del tuo frameLayout su wrap_content, altrimenti il layout del frame diventerà grande quanto il genitore, ovvero l'attività, ovvero lo schermo del telefono.
android:layout_width="wrap_content"
android:layout_height="wrap_content"
Se non impostato, perché una vista figlio della cornice, per impostazione predefinita, va nella parte superiore sinistra del layout della cornice, quindi la vista volerà semplicemente nella parte superiore sinistra dello schermo.
Passaggio 3
Nel tuo metodo oncreate, procedi come segue:
FrameLayout frameLayout = findViewById(R.id.container);
TextView textView = (TextView) View.inflate(this, R.layout.textview, null);
frameLayout.addView(textView);
(Si noti che l'impostazione dell'ultimo parametro di findViewByIdto nulle l'aggiunta della vista richiamando la addView()vista contenitore (frameLayout) equivale a collegare semplicemente la vista gonfiata passando il trueterzo parametro di findViewById(). Per ulteriori informazioni, vedere questo .)