Was macht LayoutInflater in Android?

Antworten:

165

Wenn Sie eine benutzerdefinierte Ansicht in a verwenden ListView, müssen Sie das Zeilenlayout definieren. Sie erstellen eine XML-Datei, in der Sie Android-Widgets platzieren, und im Code des Adapters müssen Sie Folgendes 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 in der offiziellen Dokumentation .

Macarse
quelle
23
Im Idealfall sollten Sie zunächst convertView testen , um zu sehen , ob Sie eine Ressource recyceln, soView view = convertView; if (view == null) { view = mInflater.... }
Jannie Theunissen
12
Ich glaube nicht, dass diese Antwort wirklich erklärt, was ein LayoutInflaterist, obwohl es erklärt, wo es verwendet werden soll. Die Antwort 1-down ist besser.
James Ko
4
Dies erklärt nicht, was ein LayoutInflater ist. Es erklärt, wie man es benutzt.
Donato
1
Ich suche nach der Erklärung von LayoutInflater.
Spieler1
@ Player1 Sie können diesen Beitrag überprüfen
Bertram Gilfoyle
282

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

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

Pentium10
quelle
74
Was ich gesucht habe, ist der Teil "mit anderen Worten", da der obere Teil bereits in den API-Dokumenten enthalten ist
Nipuna
1
Das scheint mir immer noch ziemlich abstrakt zu sein. Nehmen wir also an, ich habe eine single_list_item.xmlDatei für jede Zeile von a ListView. Ist die Verwendung dieser XML-Datei wie ein Inflater?
JohnK
167

Was macht LayoutInflatordas

Als ich mit der Android-Programmierung anfing, war ich wirklich verwirrt von LayoutInflaterund findViewById. Manchmal haben wir das eine und manchmal das andere benutzt.

  • LayoutInflaterwird verwendet, um ein neues View(oder Layout) Objekt aus einem Ihrer XML-Layouts zu erstellen.
  • findViewByIdgibt Ihnen nur einen Verweis auf eine Ansicht, die bereits erstellt wurde. Man könnte denken , dass Sie keine Ansichten noch erstellt haben, aber wenn Sie rufen setContentViewinonCreate , das Layout der Tätigkeit zusammen mit seiner Subviews aufgeblasen wird (erstellt) hinter den Kulissen.

Wenn die Ansicht bereits vorhanden ist, verwenden Sie findViewById . Wenn nicht, erstellen Sie es mit einem LayoutInflater.

Beispiel

Hier ist ein Mini-Projekt, das ich gemacht habe und das sowohl zeigt LayoutInflaterals auch findViewByIdin Aktion ist. Ohne speziellen Code sieht das Layout folgendermaßen aus.

Geben Sie hier die Bildbeschreibung ein

Das blaue Quadrat ist ein benutzerdefiniertes Layout, das mit in das Hauptlayout eingefügt wird include(siehe hier für weitere Informationen). Es wurde automatisch aufgeblasen, da es Teil der Inhaltsansicht ist. Wie Sie sehen können, hat 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 aufzublähen, habe ich dem Inflater lediglich den Namen meiner XML-Datei ( my_layout) mitgeteilt , das übergeordnete Layout, zu dem ich es hinzufügen möchte ( mainLayout), und das ich noch nicht hinzufügen möchte ( false) . (Ich könnte auch die Eltern auf einstellennull , aber dann werden die Layoutparameter der Stammansicht meines benutzerdefinierten Layouts ignoriert.)

Hier ist es wieder 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 nur verwendet wird, nachdem ein Layout bereits aufgeblasen wurde.

Ergänzungscode

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>

my_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, die die meisten Menschen verwenden, ist in a RecyclerView. (In diesen RecyclerViewBeispielen finden Sie eine Liste oder ein Raster Sie in .) Sie müssen für jedes einzelne sichtbare Element in der Liste oder im 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 in Code machen, aber es ist viel einfacher, es zuerst in XML zu definieren und dann einfach aufzublasen.
Suragch
quelle
20
Eine viel, viel bessere Erklärung als die als Lösung gekennzeichnete Antwort. Manchmal ist das Leben einfach nicht fair.
Steve Wellens
Hallo Herr, wenn ich mehr als eine Ansicht in main_activity.xml habe, wie kann ich dann die external.xml-Ansicht in main_activity mit center layout_gravity festlegen?
Prinz
Dies sollte die akzeptierte Antwort sein. So einfach für jeden Anfänger zu verstehen.
Mr Cold
Ist mylayout ein View-Typ oder ein LinearLayout-Typ?
HS Singh
@HSSingh myLayoutist eine Ansicht, obwohl ich sie als RelativeLayout hätte aufblasen können (siehe my_layout.xml). Nachdem es aufgeblasen ist, füge ich es als Unteransicht des LinearLayout-übergeordneten Elements (dh mainLayout) hinzu.
Suragch
31

LayoutInflater.inflate () bietet eine Möglichkeit, eine res / layout / *. Xml-Datei, die eine Ansicht definiert, in ein tatsächliches View-Objekt zu konvertieren, 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 Inflater?

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

Wie erhalten Sie die Ansicht, wenn die XML-Datei "list_item.xml" lautet?

View view = inflater.inflate(R.layout.list_item, parent, false);
Scott Hellam
quelle
22

Hier ist ein weiteres Beispiel ähnlich dem vorherigen, das jedoch 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 enthalten. Zuerst blasen Sie die Basiselementansicht auf (genau wie im vorherigen Beispiel) und fügen dann zur Laufzeit dynamisch TextViews hinzu. Mit android: layout_weight richtet zusätzlich alles perfekt aus.

Hier sind die Ressourcen für Layouts:

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>

schedule_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"/>

Außer Kraft setzen getView Verfahren in Erweiterung der Klasse BaseAdapter

@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;
}

Beachten Sie verschiedene Aufrufe der Inflate-Methode:

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

Diese Klasse wird verwendet, um Layout-XML-Dateien in die entsprechenden ViewObjekte zu instanziieren . Es wird niemals direkt verwendet - verwenden getLayoutInflater()oder getSystemService(String)zum Abrufen einer Standardinstanz LayoutInflater, 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

Abhishek Singh Rathaur
quelle
2
Dies mag wahr sein, beantwortet aber die Frage nicht.
Sinthia V
8

Aufblasen bedeutet, die XML-Datei zu lesen, die ein Layout (oder ein GUI-Element) beschreibt, und die tatsächlichen Objekte zu erstellen, die diesem entsprechen, und so das Objekt in einer Android-App sichtbar zu machen.

final Dialog mDateTimeDialog = new Dialog(MainActivity.this);

// Inflate the root layout
final RelativeLayout mDateTimeDialogView = (RelativeLayout) getLayoutInflater().inflate(R.layout.date_time_dialog, null);

// Grab widget instance
final DateTimePicker mDateTimePicker = (DateTimePicker) mDateTimeDialogView.findViewById(R.id.DateTimePicker);

Diese Datei könnte als date_time_dialog.xml gespeichert werden :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/DateTimeDialog" android:layout_width="100px"
    android:layout_height="wrap_content">
    <com.dt.datetimepicker.DateTimePicker
            android:id="@+id/DateTimePicker" android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    <LinearLayout android:id="@+id/ControlButtons"
            android:layout_width="fill_parent" android:layout_height="wrap_content"
            android:layout_below="@+id/DateTimePicker"
            android:padding="5dip">
            <Button android:id="@+id/SetDateTime" android:layout_width="0dip"
                    android:text="@android:string/ok" android:layout_weight="1"
                    android:layout_height="wrap_content"
                   />
            <Button android:id="@+id/ResetDateTime" android:layout_width="0dip"
                    android:text="Reset" android:layout_weight="1"
                    android:layout_height="wrap_content"
                    />
            <Button android:id="@+id/CancelDialog" android:layout_width="0dip"
                    android:text="@android:string/cancel" android:layout_weight="1"
                    android:layout_height="wrap_content"
                     />
    </LinearLayout>

Diese Datei könnte als date_time_picker.xml gespeichert werden :

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="wrap_content" `enter code here`
    android:padding="5dip" android:id="@+id/DateTimePicker">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:baselineAligned="true"
android:orientation="horizontal">

    <LinearLayout
    android:id="@+id/month_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="1dp"
    android:layout_marginTop="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginBottom="5dp"
    android:gravity="center"
    android:orientation="vertical">
    <Button
        android:id="@+id/month_plus"
        android:layout_width="45dp"
        android:layout_height="45dp"  
        android:background="@drawable/image_button_up_final"/>
    <EditText
        android:id="@+id/month_display"
        android:layout_width="45dp"
        android:layout_height="35dp"
        android:background="@drawable/picker_middle"
        android:focusable="false"
        android:gravity="center"
        android:singleLine="true"
        android:textColor="#000000">
    </EditText>
    <Button
        android:id="@+id/month_minus"
        android:layout_width="45dp"
        android:layout_height="45dp"       
        android:background="@drawable/image_button_down_final"/>
</LinearLayout>
<LinearLayout
    android:id="@+id/date_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="0.5dp"
    android:layout_marginTop="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginBottom="5dp"
    android:gravity="center"
    android:orientation="vertical">
    <Button
        android:id="@+id/date_plus"
        android:layout_width="45dp"
        android:layout_height="45dp"       
        android:background="@drawable/image_button_up_final"/>
    <EditText
        android:id="@+id/date_display"
        android:layout_width="45dp"
        android:layout_height="35dp"
        android:background="@drawable/picker_middle"
        android:gravity="center"
        android:focusable="false"
        android:inputType="number"
        android:textColor="#000000"
        android:singleLine="true"/>
    <Button
        android:id="@+id/date_minus"
        android:layout_width="45dp"
        android:layout_height="45dp"      
        android:background="@drawable/image_button_down_final"/>
</LinearLayout>
<LinearLayout
    android:id="@+id/year_container"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="0.5dp"
    android:layout_marginTop="5dp"
    android:layout_marginRight="5dp"
    android:layout_marginBottom="5dp"
    android:gravity="center"
    android:orientation="vertical">
    <Button
        android:id="@+id/year_plus"
        android:layout_width="45dp"
        android:layout_height="45dp"       
            android:background="@drawable/image_button_up_final"/>
    <EditText
        android:id="@+id/year_display"
        android:layout_width="45dp"
        android:layout_height="35dp"
        android:background="@drawable/picker_middle"
        android:gravity="center"
        android:focusable="false"
        android:inputType="number"
        android:textColor="#000000"
        android:singleLine="true"/>
    <Button
        android:id="@+id/year_minus"
        android:layout_width="45dp"
        android:layout_height="45dp"       
        android:background="@drawable/image_button_down_final"/>
</LinearLayout>
<LinearLayout
        android:id="@+id/hour_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:gravity="center"
        android:orientation="vertical">
        <Button
            android:id="@+id/hour_plus"
            android:layout_width="45dp"
            android:layout_height="45dp"          
            android:background="@drawable/image_button_up_final"/>
        <EditText
            android:id="@+id/hour_display"
            android:layout_width="45dp"
            android:layout_height="35dp"
            android:background="@drawable/picker_middle"
            android:gravity="center"
            android:focusable="false"
            android:inputType="number"
            android:textColor="#000000"
            android:singleLine="true">
        </EditText>
        <Button
            android:id="@+id/hour_minus"
            android:layout_width="45dp"
            android:layout_height="45dp"       
            android:background="@drawable/image_button_down_final"/>
    </LinearLayout>
    <LinearLayout
        android:id="@+id/min_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="0.35dp"
        android:layout_marginTop="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginBottom="5dp"
        android:gravity="center"
        android:orientation="vertical">
        <Button
            android:id="@+id/min_plus"
            android:layout_width="45dp"
            android:layout_height="45dp"       
            android:background="@drawable/image_button_up_final"/>
        <EditText
            android:id="@+id/min_display"
            android:layout_width="45dp"
            android:layout_height="35dp"
            android:background="@drawable/picker_middle"
            android:gravity="center"
            android:focusable="false"
            android:inputType="number"
            android:textColor="#000000"
            android:singleLine="true"/>
        <Button
            android:id="@+id/min_minus"
            android:layout_width="45dp"
            android:layout_height="45dp"       
            android:background="@drawable/image_button_down_final"/>
    </LinearLayout>

    <LinearLayout 
        android:id="@+id/meridiem_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="0.35dp"
        android:layout_marginTop="5dp"
        android:layout_marginRight="5dp"
        android:layout_marginBottom="5dp"
        android:gravity="center"
        android:orientation="vertical">
        <ToggleButton 
            android:id="@+id/toggle_display"
            style="@style/SpecialToggleButton"
            android:layout_width="40dp"
            android:layout_height="32dp"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="45dp"
            android:layout_marginRight="5dp"
            android:layout_marginBottom="5dp"
            android:padding="5dp"
            android:gravity="center"
            android:textOn="@string/meridiem_AM"
            android:textOff="@string/meridiem_PM"
            android:checked="true"/>

           <!--  android:checked="true" --> 

    </LinearLayout>
</LinearLayout>
</RelativeLayout>

Die MainActivityals MainActivity.java gespeicherte Klasse :

public class MainActivity extends Activity {
    EditText editText;
    Button button_click;
    public static Activity me = null;
    String meridiem;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText)findViewById(R.id.edittext1);
        button_click = (Button)findViewById(R.id.button1);
        button_click.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View view){
                final Dialog mDateTimeDialog = new Dialog(MainActivity.this);
                final RelativeLayout mDateTimeDialogView = (RelativeLayout)   getLayoutInflater().inflate(R.layout.date_time_dialog, null);
                final DateTimePicker mDateTimePicker = (DateTimePicker) mDateTimeDialogView.findViewById(R.id.DateTimePicker);
                // mDateTimePicker.setDateChangedListener();
                ((Button) mDateTimeDialogView.findViewById(R.id.SetDateTime)).setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                        mDateTimePicker.clearFocus();
                        int hour = mDateTimePicker.getHour();
                        String result_string = mDateTimePicker.getMonth() +" "+   String.valueOf(mDateTimePicker.getDay()) + ", " + String.valueOf(mDateTimePicker.getYear())
                        + "  " +(mDateTimePicker.getHour()<=9? String.valueOf("0"+mDateTimePicker.getHour()) : String.valueOf(mDateTimePicker.getHour())) + ":" + (mDateTimePicker.getMinute()<=9?String.valueOf("0"+mDateTimePicker.getMinute()):String.valueOf(mDateTimePicker.getMinute()))+" "+mDateTimePicker.getMeridiem();
                        editText.setText(result_string);
                        mDateTimeDialog.dismiss();
                    }
                });
                // Cancel the dialog when the "Cancel" button is clicked
                ((Button) mDateTimeDialogView.findViewById(R.id.CancelDialog)).setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        mDateTimeDialog.cancel();
                    }
                });
                // Reset Date and Time pickers when the "Reset" button is clicked
                ((Button) mDateTimeDialogView.findViewById(R.id.ResetDateTime)).setOnClickListener(new OnClickListener() {
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        mDateTimePicker.reset();
                    }
                });

                // Setup TimePicker
                // No title on the dialog window
                mDateTimeDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
                // Set the dialog content view
                mDateTimeDialog.setContentView(mDateTimeDialogView);
                // Display the dialog
                mDateTimeDialog.show();
            }
        });
    }
}
Jijo
quelle
6

Was macht der Inflater?

Es nimmt ein XML-Layout als Eingabe (z. B.) und konvertiert es in ein View-Objekt.

Warum gebraucht

Stellen wir uns ein Szenario vor, in dem wir eine benutzerdefinierte Listenansicht erstellen müssen. Jetzt sollte jede Zeile benutzerdefiniert sein. Aber wie können wir das machen? Es ist nicht möglich, einer Zeile mit Listenansicht ein XML-Layout zuzuweisen. Also erstellen wir ein View-Objekt. Auf diese Weise können wir auf die darin enthaltenen Elemente (Textansicht, Bildansicht usw.) zugreifen und das Objekt auch als Zeile der Listenansicht zuweisen

Wenn wir also irgendwo ein Objekt vom Typ Ansicht zuweisen müssen und unser benutzerdefiniertes XML-Design haben, konvertieren wir es einfach per Inflater in ein Objekt und verwenden es.

Zahan Safallwa
quelle
Also, Herr Zahan, ist es wie das DOM in Javascript? • o •
Jeancarlo Fontalvo
6

LayoutInflater ist eine Klasse, mit der Layout-XML-Dateien in die entsprechenden Ansichtsobjekte instanziiert werden, die in Java-Programmen verwendet werden können. In einfachen Worten gibt es zwei Möglichkeiten, eine Benutzeroberfläche in Android zu erstellen. Einer ist statisch und ein anderer dynamisch oder programmgesteuert. Angenommen, wir haben ein einfaches Layout main.xml mit einem textviewund einem edittextwie 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, indem wir

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

Eine dynamische Art, eine Ansicht zu erstellen, bedeutet, dass die Ansicht in unserer main.xml nicht erwähnt wird, wir sie jedoch zur Laufzeit anzeigen möchten. 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 hier werden wir 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(t);

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

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

Hier ist ein Beispiel für das Abrufen einer Referenz für die Stammansicht eines Layouts, das Aufblasen und die Verwendung mit setContentView (Ansichtsansicht).

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LayoutInflater li=getLayoutInflater();
    View rootView=li.inflate(R.layout.activity_main,null);
    setContentView(rootView);


}
Gal Rom
quelle
1

Layout Inflater ist eine Klasse, die die Beschreibung des XML-Erscheinungsbilds liest und sie in Java-basierte View-Objekte konvertiert.

Muhammed Shibin
quelle
0

Meine benutzerdefinierte Liste hoffe, dass es das Konzept illustriert

public class second extends ListActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second);
//  TextView textview=(TextView)findViewById(R.id.textView1);
//  textview.setText(getIntent().getExtras().getString("value"));

    setListAdapter(new MyAdapter(this,R.layout.list_item,R.id.textView1, getResources().getStringArray(R.array.counteries)));
}

private class MyAdapter extends ArrayAdapter<String>{

    public MyAdapter(Context context, int resource, int textViewResourceId,
            String[] objects) {
        super(context, resource, textViewResourceId, objects);
        // TODO Auto-generated constructor stub
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row=inflater.inflate(R.layout.list_item,parent,false);
        String[]items=getResources().getStringArray(R.array.counteries);

        ImageView iv=(ImageView) row.findViewById(R.id.imageView1);
        TextView tv=(TextView) row.findViewById(R.id.textView1);
        tv.setText(items[position]);

        if(items[position].equals("unitedstates")){
            iv.setImageResource(R.drawable.usa);
        }else   if(items[position].equals("Russia")){
            iv.setImageResource(R.drawable.russia);
        }else   if(items[position].equals("Japan")){
            iv.setImageResource(R.drawable.japan);
        }
        // TODO Auto-generated method stub
        return row;
    }

}

}
Moustafa Bayommy
quelle
0

LayoutInflater ist eine grundlegende Komponente in Android. Sie müssen es ständig verwenden, um XML-Dateien in Ansichtshierarchien umzuwandeln.

vishwas
quelle
0

LayoutInflater erstellt Ansichtsobjekte basierend auf in XML definierten Layouts. Es gibt verschiedene Möglichkeiten, LayoutInflater zu verwenden, z. B. das Erstellen benutzerdefinierter Ansichten, das Aufblasen von Fragmentansichten in Aktivitätsansichten, das Erstellen von Dialogen oder das einfache Aufblasen einer Layoutdateiansicht in eine Aktivität.

Es gibt viele Missverständnisse darüber, wie der Inflationsprozess funktioniert. Ich denke, das liegt an der schlechten Dokumentation für die inflate () -Methode. Wenn Sie mehr über die inflate () -Methode erfahren möchten, habe ich hier einen Blog-Beitrag darüber geschrieben:

https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/

Seanjfarrell
quelle
0

Inflater konvertiert tatsächlich eine Art Konvertierung in Daten, Ansichten, Instanzen, in sichtbare UI-Darstellungen. Dadurch werden Daten verwendet, die möglicherweise von Adaptern usw. programmgesteuert eingegeben werden. Integrieren Sie es dann in eine von Ihnen definierte XML-Datei, die angibt, wie die Daten in der Benutzeroberfläche dargestellt werden sollen


quelle