Was macht LayoutInflater in Android?

Lesezeit: 10 Minuten

Was macht LayoutInflater in Android
Benutzer386430

Wozu benutzt man LayoutInflater bei Android?

  • Überprüfen Sie, ob dieser hilft.

    – Bertram Gilfoyle

    7. August 2018 um 16:22 Uhr

1646176990 501 Was macht LayoutInflater in Android
Pentium10

Die LayoutInflater -Klasse wird verwendet, um den Inhalt von Layout-XML-Dateien in ihren entsprechenden View-Objekten zu instanziieren.

Mit anderen Worten, es nimmt eine XML-Datei als Eingabe und erstellt daraus die View-Objekte.

  • Was ich gesucht habe, ist der Teil “mit anderen Worten”, da der obere Teil bereits in den API-Dokumenten enthalten ist

    – Nipuna

    27. Juli 2011 um 6:06 Uhr

  • Das kommt mir noch ziemlich abstrakt vor. Nehmen wir also an, ich habe eine single_list_item.xml Datei für jede Zeile von a ListView. Ist die Verwendung dieser XML-Datei eine Art Luftpumpe?

    – JohannesK

    27. Juni 2012 um 12:36 Uhr

  • Tatsächlich sagen die API-Dokumente alles. Das Instanziieren des Inhalts von XML ist die genaue Beschreibung. Manchmal lesen wir zu tief in den Text hinein und verpassen das Offensichtliche

    – dp2050

    22. Dezember 2020 um 0:48 Uhr

Was macht LayoutInflater in Android
Suragch

Was macht LayoutInflator tun?

Als ich zum ersten Mal mit der Android-Programmierung anfing, war ich wirklich verwirrt LayoutInflater und findViewById. Manchmal haben wir das eine und manchmal das andere benutzt.

  • LayoutInflater wird verwendet, um eine neue zu erstellen View (oder Layout) Objekt aus einem Ihrer XML-Layouts.
  • findViewById gibt Ihnen nur einen Verweis auf eine Ansicht, die bereits erstellt wurde. Sie denken vielleicht, dass Sie noch keine Ansichten erstellt haben, aber wann immer Sie anrufen setContentView in onCreatewird das Layout der Aktivität zusammen mit ihren Unteransichten hinter den Kulissen aufgeblasen (erstellt).

Wenn die Ansicht also bereits vorhanden ist, verwenden Sie sie findViewById. Wenn nicht, dann erstellen Sie es mit a LayoutInflater.

Beispiel

Hier ist ein Mini-Projekt, das ich gemacht habe, das beide zeigt LayoutInflater und findViewById in Aktion. Ohne speziellen Code sieht das Layout so aus.

Geben Sie hier die Bildbeschreibung ein

Das blaue Quadrat ist ein benutzerdefiniertes Layout, das in das Hauptlayout eingefügt wurde include (mehr dazu hier). Es wurde automatisch aufgeblasen, da es Teil der Inhaltsansicht ist. Wie Sie sehen, ist der Code nichts Besonderes.

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

Lassen Sie uns nun eine weitere Kopie unseres benutzerdefinierten Layouts aufblasen (erstellen) und hinzufügen.

Geben Sie hier die Bildbeschreibung ein

LayoutInflater inflater = getLayoutInflater();
View myLayout = inflater.inflate(R.layout.my_layout, mainLayout, false);

Um das neue Ansichtslayout aufzublasen, habe ich dem Inflater lediglich den Namen meiner XML-Datei mitgeteilt (my_layout), das übergeordnete Layout, dem ich es hinzufügen möchte (mainLayout), und dass ich es eigentlich noch nicht hinzufügen möchte (false). (Ich könnte die Eltern auch auf setzen nullaber dann würden die Layoutparameter der Stammansicht meines benutzerdefinierten Layouts ignoriert.)

Hier nochmal im Kontext.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // inflate the main layout for the activity
        setContentView(R.layout.activity_main);

        // get a reference to the already created main layout
        LinearLayout mainLayout = (LinearLayout) findViewById(R.id.activity_main_layout);

        // inflate (create) another copy of our custom layout
        LayoutInflater inflater = getLayoutInflater();
        View myLayout = inflater.inflate(R.layout.my_layout, mainLayout, false);

        // make changes to our custom layout and its subviews
        myLayout.setBackgroundColor(ContextCompat.getColor(this, R.color.colorAccent));
        TextView textView = (TextView) myLayout.findViewById(R.id.textView);
        textView.setText("New Layout");

        // add our custom layout to the main layout
        mainLayout.addView(myLayout);
    }
}

Beachte wie findViewById wird nur verwendet, nachdem ein Layout bereits aufgeblasen wurde.

Ergänzender Kodex

Hier ist die XML für das obige Beispiel.

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main_layout"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp">

    <!-- Here is the inserted layout -->
    <include layout="@layout/my_layout"/>

</LinearLayout>

mein_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:background="@color/colorPrimary">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:padding="5dp"
        android:textColor="@android:color/white"
        android:text="My Layout"/>

</RelativeLayout>

Wann brauchen Sie LayoutInflater

  • Die häufigste Zeit, in der die meisten Menschen es verwenden, ist in a RecyclerView. (Siehe diese RecyclerView Beispiele für eine Liste oder ein Raster.) Sie müssen für jedes einzelne sichtbare Element in der Liste oder dem Raster ein neues Layout aufblasen.
  • Sie können auch einen Layout-Inflater verwenden, wenn Sie ein komplexes Layout haben, das Sie programmgesteuert hinzufügen möchten (wie in unserem Beispiel). Sie könnten alles im Code machen, aber es ist viel einfacher, es zuerst in XML zu definieren und es dann einfach aufzublasen.

  • Eine viel, viel bessere Erklärung als die als Lösung markierte Antwort. Manchmal ist das Leben einfach nicht fair.

    – Steve Wellens

    12. April 2018 um 4:10 Uhr

  • Hallo Sir, wenn ich mehr als eine Ansicht in main_activity.xml habe, wie kann ich dann die Ansicht external.xml in main_activity mit center layout_gravity einstellen.

    – Prinz Dholakiya

    27. August 2018 um 6:02 Uhr


  • Dies sollte die akzeptierte Antwort sein. So einfach zu verstehen für jeden Anfänger.

    – Herr Kalt

    6. Juni 2019 um 10:09 Uhr

  • Ist mylayout ein View-Typ oder ein LinearLayout-Typ?

    – Tyrann Maguire

    6. Oktober 2019 um 5:02 Uhr

  • @HSSingh, myLayout ist eine Ansicht, obwohl ich sie als RelativeLayout hätte aufblasen können (siehe my_layout.xml). Nachdem es aufgeblasen wurde, füge ich es als Unteransicht des übergeordneten Elements LinearLayout hinzu (d. h. mainLayout).

    – Suragch

    7. Oktober 2019 um 0:51 Uhr

Was macht LayoutInflater in Android
Macarse

Wenn Sie eine benutzerdefinierte Ansicht in a ListView Sie müssen das Zeilenlayout definieren. Sie erstellen eine XML-Datei, in der Sie Android-Widgets platzieren, und müssen dann im Code des Adapters so etwas tun:

public MyAdapter(Context context, List<MyObject> objects) extends ArrayAdapter {
  super(context, 1, objects);
  /* We get the inflator in the constructor */
  mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
  View view;
  /* We inflate the xml which gives us a view */
  view = mInflater.inflate(R.layout.my_list_custom_row, parent, false);

  /* Get the item in the adapter */
  MyObject myObject = getItem(position);

  /* Get the widget with id name which is defined in the xml of the row */
  TextView name = (TextView) view.findViewById(R.id.name);

  /* Populate the row's xml with info from the item */
  name.setText(myObject.getName());

  /* Return the generated view */
  return view;
}

Lesen Sie mehr im amtliche Dokumentation.

  • Idealerweise sollten Sie convertView zuerst testen, um zu sehen, ob Sie eine Ressource recyceln können View view = convertView; if (view == null) { view = mInflater.... }

    – Jannie Theunissen

    22. März 2013 um 12:32 Uhr

  • Ich glaube nicht, dass diese Antwort wirklich erklärt, was a LayoutInflater ist, obwohl es erklärt, wo es zu verwenden ist. Die Antwort 1-down ist besser.

    – James Ko

    8. Juni 2017 um 16:43 Uhr

  • Dies erklärt nicht, was ein LayoutInflater ist. Es erklärt, wie man es benutzt.

    – Daniel Viglione

    14. Juli 2017 um 21:41 Uhr

  • Ich suche die Erklärung von LayoutInflater.

    – Spieler1

    1. März 2018 um 22:59 Uhr

  • @Player1 Sie können diesen Beitrag überprüfen

    – Bertram Gilfoyle

    11. August 2018 um 6:48 Uhr


LayoutInflater.inflate() bietet eine Möglichkeit, eine res/layout/*.xml-Datei, die eine Ansicht definiert, in ein tatsächliches Ansichtsobjekt umzuwandeln, das in Ihrem Anwendungsquellcode verwendet werden kann.

grundlegende zwei Schritte: Holen Sie sich den Inflater und blasen Sie dann die Ressource auf

Wie bekommt man den Inflator?

LayoutInflater inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

Wie erhalten Sie die Ansicht unter der Annahme, dass die XML-Datei “list_item.xml” ist?

View view = inflater.inflate(R.layout.list_item, parent, false);

Hier ist ein weiteres Beispiel, das dem vorherigen ähnlich ist, aber erweitert wurde, um die Aufblasparameter und das dynamische Verhalten, das es bieten kann, weiter zu demonstrieren.

Angenommen, Ihr ListView-Zeilenlayout kann eine variable Anzahl von TextViews haben. Also vergrößern Sie zuerst das Basiselement View (genau wie im vorherigen Beispiel) und fügen dann in einer Schleife dynamisch TextViews zur Laufzeit hinzu. Die Verwendung von android:layout_weight richtet zusätzlich alles perfekt aus.

Hier sind die Layouts-Ressourcen:

list_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" >
    <TextView 
        android:id="@+id/field1"
        android:layout_width="0dp"  
        android:layout_height="wrap_content" 
        android:layout_weight="2"/>
    <TextView 
        android:id="@+id/field2"
        android:layout_width="0dp"  
        android:layout_height="wrap_content" 
        android:layout_weight="1"
/>
</LinearLayout>

Zeitplan_Layout.xml

<?xml version="1.0" encoding="utf-8"?>
   <TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="0dp"  
    android:layout_height="wrap_content" 
    android:layout_weight="1"/>

Überschreiben getView Methode in Erweiterung der BaseAdapter-Klasse

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = activity.getLayoutInflater();
    View lst_item_view = inflater.inflate(R.layout.list_layout, null);
    TextView t1 = (TextView) lst_item_view.findViewById(R.id.field1);
    TextView t2 = (TextView) lst_item_view.findViewById(R.id.field2);
    t1.setText("some value");
    t2.setText("another value");

    // dinamically add TextViews for each item in ArrayList list_schedule
    for(int i = 0; i < list_schedule.size(); i++){
        View schedule_view = inflater.inflate(R.layout.schedule_layout, (ViewGroup) lst_item_view, false);
        ((TextView)schedule_view).setText(list_schedule.get(i));
        ((ViewGroup) lst_item_view).addView(schedule_view);
    }
    return lst_item_view;
}

Notiz verschiedene Aufblasmethodenaufrufe:

inflater.inflate(R.layout.list_layout, null); // no parent
inflater.inflate(R.layout.schedule_layout, (ViewGroup) lst_item_view, false); // with parent preserving LayoutParams

1646176993 952 Was macht LayoutInflater in Android
Amog Kulkarni

Diese Klasse wird verwendet, um die Layout-XML-Datei in die entsprechende zu instanziieren View Objekte. Es darf niemals direkt verwendet werden – use getLayoutInflater() oder getSystemService(String) einen Standard abrufen LayoutInflater Instanz, die bereits mit dem aktuellen Kontext verbunden und für das Gerät, auf dem Sie ausgeführt werden, korrekt konfiguriert ist. Zum Beispiel:

LayoutInflater inflater = (LayoutInflater)context.getSystemService
      (Context.LAYOUT_INFLATER_SERVICE);

Referenz: http://developer.android.com/reference/android/view/LayoutInflater.html

1646176994 549 Was macht LayoutInflater in Android
Arry

LayoutInflater ist eine Klasse, die verwendet wird, um Layout-XML-Dateien in die entsprechenden Ansichtsobjekte zu instanziieren, die in Java-Programmen verwendet werden können. Einfach ausgedrückt gibt es zwei Möglichkeiten, eine Benutzeroberfläche in Android zu erstellen. Einer ist ein statischer Weg und ein anderer ist dynamisch oder programmatisch. Angenommen, wir haben ein einfaches Layout main.xml mit einem textview und ein edittext wie folgt.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/layout1"
    >
<TextView
        android:id="@+id/namelabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Enter your name"
        android:textAppearance="?android:attr/textAppearanceLarge" >
    </TextView>
    <EditText
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_marginTop="14dp"
        android:ems="10">
    </EditText>
</LinearLayout>

Wir können dieses Layout statisch anzeigen durch

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

Eine dynamische Art, eine Ansicht zu erstellen, bedeutet, dass die Ansicht nicht in unserer main.xml erwähnt wird, aber wir wollen damit zur Laufzeit zeigen. Zum Beispiel haben wir ein anderes XML im Layoutordner als footer.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/TextView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:text="Add your record"
    android:textSize="24sp" >
 </TextView>

Wir möchten dieses Textfeld zur Laufzeit in unserer Hauptbenutzeroberfläche anzeigen. Also werden wir hier text.xml aufblasen. Siehe wie:

public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  final LayoutInflater  inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  TextView t = (TextView)inflater.inflate(R.layout.footer,null);

  lLayout = (LinearLayout)findViewById(R.id.layout1);
  lLayout.addView

Hier habe ich getSystemService (String) verwendet, um eine LayoutInflater-Instanz abzurufen. Ich kann getLayoutInflator() auch zum Aufblasen verwenden, anstatt getSystemService (String) wie unten zu verwenden:

LayoutInflator inflater = getLayoutInflater();
TextView t = (TextView) inflater.inflate(R.layout.footer, null);
lLayout.addView

905940cookie-checkWas macht LayoutInflater in Android?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy