Frage

Wozu benutzt man LayoutInflater in Android?

War es hilfreich?

Lösung

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

Andere Tipps

Layoutinflater Die Klasse wird verwendet, um das Layout -XML -Datei in die entsprechenden Ansichtsobjekte zu instanziieren.

Mit anderen Worten, es dauert als Eingabe einer XML -Datei und erstellt die Ansichtsobjekte daraus.

Was macht LayoutInflator tun?

Als ich mit Android -Programmierung anfing, war ich wirklich verwirrt von LayoutInflater und findViewById. Manchmal haben wir einen und manchmal den anderen 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 als bereits erstellt. Sie könnten denken, dass Sie noch keine Ansichten erstellt haben, aber wenn Sie anrufen setContentView in onCreate, Das Layout der Aktivität zusammen mit den Unteransichten wird hinter den Kulissen aufgeblasen (erstellt).

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

Beispiel

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

enter image description here

Das blaue Quadrat ist ein benutzerdefiniertes Layout, das in das Hauptlayout mit eingefügt wurde include (sehen hier für mehr). Es wurde automatisch aufgeblasen, weil 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 es hinzufügen.

enter image description here

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

Um das neue Ansichtslayout aufzublasen, habe ich dem Inflater nur den Namen meiner XML -Datei mitgeteilt (my_layout), das übergeordnete Layout, zu dem ich es hinzufügen möchte ((mainLayout), und dass ich es noch nicht hinzufügen möchte ((false). (Ich könnte auch den Elternteil aufstellen null, Aber dann würden die Layoutparameter der Root -Ansicht 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 wird erst verwendet, nachdem bereits ein Layout aufgeblasen wurde.

Ergänzungscode

Hier ist das 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 in a verwenden, ist RecyclerView. (Siehe diese RecyclerView Beispiele für a aufführen oder ein Netz.) Sie müssen ein neues Layout für jedes einzelne sichtbare Element in der Liste oder in der Raster aufblasen.
  • Sie können auch einen Layout -Inflater verwenden, wenn Sie ein komplexes Layout haben, das Sie programmgesteuert hinzufügen möchten (wie wir es in unserem Beispiel getan haben). Sie könnten alles in Code machen, aber es ist viel einfacher, es zuerst in XML zu definieren und dann einfach aufzublasen.

Layoutinflater.inflate () bietet ein Mittel zum Konvertieren einer rES/Layout/*. XML -Datei, die eine Ansicht in ein in Ihrem Anwendungsquellcode verwendbares Ansichtsobjekt definiert.

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

Wie bekommst du den Inflater?

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

Wie erhalten Sie die Ansicht unter der Annahme, dass die XML -Datei "list_item.xml" lautet?

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

Hier ist ein weiteres Beispiel, das dem vorherigen ähnelt, aber erweitert wird, um aufblöde Parameter und dynamisches Verhalten weiter zu demonstrieren.

Angenommen, Ihr ListView -Zeilen -Layout kann eine variable Anzahl von Textviews haben. Aufblasen Sie also zuerst die Basisartikelansicht (genau wie im vorherigen Beispiel) und dann zur Laufzeit dynamisch Textansichten hinzugefügt. Verwenden 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>

plan_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 der Erweiterung der Basisadapterklasse

@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 Unterschiedliche Aufblasen -Methodenaufrufe:

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

Diese Klasse wird verwendet, um das Layout -XML -Datei in ihre entsprechende Layout -Datei zu instanziieren View Objekte. Es wird nie direkt verwendet - verwenden getLayoutInflater() oder getSystemService(String) um einen Standard abzurufen LayoutInflater Instanz, die bereits an den aktuellen Kontext angeschlossen und für das Gerät, auf dem Sie ausgeführt werden, korrekt konfiguriert sind. Zum Beispiel:

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

Bezug: http://developer.android.com/reference/android/view/layoutinflater.html

Aufblasen bedeutet, die XML -Datei zu lesen, die ein Layout (oder GUI -Element) beschreibt und die tatsächlichen Objekte erstellt, die ihm entsprechen, und somit das Objekt in einer Android -App sichtbar 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 gespeichert als DATE_TIME_DIALOG.xml:

<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 gespeichert als DATE_TIME_PICKER.XML:

 <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>

Das MainActivity Klasse gerettet als MainActivity.java:

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();
            }
        });
    }
}

Was Inflater tut

Es dauert ein XML -Layout als Eingabe (sagen wir) und konvertiert es in das Anzeigen von Objekten.

Warum benötigt

Lassen Sie uns ein Szenario denken, in dem wir eine benutzerdefinierte Liste erstellen müssen. Jetzt sollte jede Zeile individuell sein. Aber wie können wir es tun? Es ist nicht möglich, einer Reihe von ListView ein XML -Layout zuzuweisen. Wir erstellen also ein Ansichtsobjekt. Somit können wir auf die darin enthaltenen Elemente zugreifen (TextView, ImageView usw.) und das Objekt auch als Zeile von ListView zuweisen

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

Hier ist ein Beispiel, um eine Auffressen für die Wurzelansicht eines Layouts zu erhalten, sie aufzublasen und mit SetContentView (Ansicht anzeigen) zu verwenden.

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


}

Layoutinflater ist eine Klasse, mit der Layout -XML -Datei in ihre entsprechenden Ansichtsobjekte instanziiert wird, die in Java -Programmen verwendet werden können. In einfachen Worten gibt es zwei Möglichkeiten, in Android UI zu erstellen. Einer ist ein statischer Weg und ein anderer ist dynamisch oder programmatisch. Angenommen, wir haben ein einfaches Layout main.xml mit einem haben textview und ein edittext folgendermaßen.

<?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 auf statische Weise anzeigen

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

Eine dynamische Art, eine Ansicht zu erstellen, bedeutet, dass die Ansicht in unserem Main.xml nicht erwähnt wird, aber wir möchten dies in der Laufzeit zeigen. Zum Beispiel haben wir einen weiteren XML im Layoutordner als Fußzeile.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 in der Laufzeit in unserer Haupt Benutzeroberflä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 GetLayoutInflator () auch verwenden, um aufzublasen, anstatt GetSystemService (String) wie unten zu verwenden:

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

Layout -Inflater ist eine Klasse, die die XML -Erscheinungsbeschreibung liest und sie in Java -basierte Ansichtsobjekte umwandelt.

Meine Anpassungsliste hoffe, dass es das Konzept veranschaulicht

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

}

}

Layoutinflater ist eine grundlegende Komponente in Android. Sie müssen es die ganze Zeit verwenden, um XML -Dateien in Ansicht hierarchien zu verwandeln.

Layoutinflater erstellt Ansichtsobjekte basierend auf in XML definierten Layouts. Es gibt verschiedene Möglichkeiten, Layoutinflater zu verwenden, einschließlich des Erstellens benutzerdefinierter Ansichten, des Aufblasen von Fragmentansichten in Aktivitätsansichten, zum Erstellen von Dialogen oder einfachem Aufblasen einer Layout -Dateiansicht in eine Aktivität.

Es gibt viele Missverständnisse darüber, wie der Inflationsprozess funktioniert. Ich denke, dies stammt aus den Armen der Dokumentation für die Inflate () -Methode. Wenn Sie im Detail mehr über die Inflate () -Methode erfahren möchten, habe ich hier einen Blog -Beitrag darüber geschrieben:

https://www.bignerdranch.com/blog/undallanding-android-layoutinflater-inflate/

Inflater konvertieren tatsächlich eine Art von Daten, Ansichten, Instanzen, zu sichtbaren UI -Darstellungen. Integrieren Sie es dann in einen von Ihnen definierten XML, der zeigt, wie die Daten in der UI dargestellt werden sollten

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top