Ich habe dieses Problem untersucht, mich auf die LayoutInflater-Dokumente bezogen und ein kleines Beispiel-Demonstrationsprojekt eingerichtet. Die folgenden Tutorials zeigen, wie Sie ein Layout mithilfe dynamisch füllen LayoutInflater
.
Bevor wir anfangen, sehen Sie, wie LayoutInflater.inflate()
Parameter aussehen:
- Ressource : ID für eine zu ladende XML-Layoutressource (z. B.
R.layout.main_page
)
- Wurzel : Optional Ansicht der Elternteil der erzeugten Hierarchie werden (wenn
attachToRoot
ist true
) oder auch nur ein Objekt , das einen Satz liefert LayoutParams
Werte für die Wurzel der Hierarchie zurückgeführt (wenn attachToRoot
ist false
) .
attachToRoot : Soll die aufgeblasene Hierarchie an den Root-Parameter angehängt werden? Wenn false, wird root nur verwendet, um die richtige Unterklasse LayoutParams
für die Root-Ansicht im XML zu erstellen .
Rückgabe : Die Stammansicht der aufgeblasenen Hierarchie. Wenn root angegeben wurde und attachToRoot
ist true
, ist dies root; Andernfalls ist es das Stammverzeichnis der aufgeblasenen XML-Datei.
Nun zum Beispiellayout und Code.
Hauptlayout ( main.xml
):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent">
</LinearLayout>
In diesen Container wird eine separate Textansicht eingefügt, die als kleines rotes Quadrat angezeigt wird, wenn Layoutparameter erfolgreich aus XML ( red.xml
) angewendet werden :
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="25dp"
android:layout_height="25dp"
android:background="#ff0000"
android:text="red" />
Wird jetzt LayoutInflater
mit verschiedenen Variationen von Aufrufparametern verwendet
public class InflaterTest extends Activity {
private View view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ViewGroup parent = (ViewGroup) findViewById(R.id.container);
// result: layout_height=wrap_content layout_width=match_parent
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view);
// result: layout_height=100 layout_width=100
view = LayoutInflater.from(this).inflate(R.layout.red, null);
parent.addView(view, 100, 100);
// result: layout_height=25dp layout_width=25dp
// view=textView due to attachRoot=false
view = LayoutInflater.from(this).inflate(R.layout.red, parent, false);
parent.addView(view);
// result: layout_height=25dp layout_width=25dp
// parent.addView not necessary as this is already done by attachRoot=true
// view=root due to parent supplied as hierarchy root and attachRoot=true
view = LayoutInflater.from(this).inflate(R.layout.red, parent, true);
}
}
Die tatsächlichen Ergebnisse der Parametervariationen sind im Code dokumentiert.
ÜBERSICHT: Das Aufrufen LayoutInflater
ohne Angabe von root führt zu einem Anstieg des Anrufs, wobei die Layoutparameter aus dem XML ignoriert werden. Der Aufruf von inflate mit root ist nicht gleich null
und attachRoot=true
lädt die Layoutparameter, gibt jedoch das Root-Objekt erneut zurück, wodurch weitere Layoutänderungen am geladenen Objekt verhindert werden (es sei denn, Sie finden es mit findViewById()
). Die aufrufende Konvention, die Sie höchstwahrscheinlich verwenden möchten, lautet daher:
loadedView = LayoutInflater.from(context)
.inflate(R.layout.layout_to_load, parent, false);
Um Hilfe bei der Layout - Probleme, die Layout - Inspektor ist sehr zu empfehlen.