Que fait LayoutInflater dans Android?

Réponses:

164

Lorsque vous utilisez une vue personnalisée dans un, ListViewvous devez définir la disposition des lignes. Vous créez un xml où vous placez des widgets Android, puis dans le code de l'adaptateur, vous devez faire quelque chose comme ceci:

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

En savoir plus dans la documentation officielle .

Macarse
la source
23
Idéalement, vous devriez d'abord tester convertView pour voir si vous pouvez recycler une ressource, doncView view = convertView; if (view == null) { view = mInflater.... }
Jannie Theunissen
13
Je ne pense pas que cette réponse explique vraiment ce qu'est un LayoutInflater, bien qu'elle explique où l'utiliser. La réponse 1-down est meilleure.
James Ko
5
Cela n'explique pas ce qu'est un LayoutInflater. Il explique comment l'utiliser.
Donato
2
Je cherche l'explication de LayoutInflater.
Player1
@ Player1 Vous pouvez consulter ce message
Bertram Gilfoyle
284

La classe LayoutInflater est utilisée pour instancier le contenu des fichiers XML de disposition dans leurs objets View correspondants.

En d'autres termes, il prend un fichier XML en entrée et en construit les objets View.

Pentium10
la source
75
Ce que je cherchais, c'est la partie "en d'autres termes" puisque la partie supérieure est déjà dans la documentation de l'API
Nipuna
1
Cela me semble encore assez abstrait. Donc, disons que j'ai un single_list_item.xmlfichier pour chaque ligne d'un fichier ListView. L'utilisation de ce fichier XML est-elle un peu comme un gonfleur?
JohnK
169

Que fait LayoutInflator-il?

Quand j'ai commencé la programmation Android pour la première fois, j'étais vraiment confus par LayoutInflateret findViewById. Parfois, nous avons utilisé l'un et parfois l'autre.

  • LayoutInflaterest utilisé pour créer un nouvel View(ou Layout) objet à partir de l'une de vos dispositions xml.
  • findViewByIdvous donne simplement une référence à une vue qui a déjà été créée. Vous pourriez penser que vous n'avez créé aucune vue, mais chaque fois que vous appelez setContentViewdans onCreate, la mise en page de l'activité ainsi que ses sous - vues gets gonflé (créé) dans les coulisses.

Donc, si la vue existe déjà, utilisez-la findViewById. Sinon, créez-le avec un LayoutInflater.

Exemple

Voici un mini projet que j'ai réalisé qui montre à la fois LayoutInflateret findViewByIden action. Sans code spécial, la disposition ressemble à ceci.

entrez la description de l'image ici

Le carré bleu est une disposition personnalisée insérée dans la disposition principale avec include(voir ici pour en savoir plus). Il a été gonflé automatiquement car il fait partie de la vue du contenu. Comme vous pouvez le voir, le code n'a rien de spécial.

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

Maintenant, gonflons (créons) une autre copie de notre mise en page personnalisée et ajoutons-la.

entrez la description de l'image ici

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

Pour gonfler la nouvelle disposition de la vue, tout ce que j'ai fait a été de dire au gonfleur le nom de mon fichier xml ( my_layout), la disposition parent à laquelle je veux l'ajouter ( mainLayout), et que je ne veux pas encore l'ajouter ( false) . (Je pourrais également définir le parent sur null, mais les paramètres de disposition de la vue racine de ma disposition personnalisée seraient ignorés.)

Le voici à nouveau dans son contexte.

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

Remarquez comment findViewByIdest utilisé uniquement après qu'une disposition a déjà été gonflée.

Code supplémentaire

Voici le xml pour l'exemple ci-dessus.

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>

Quand avez-vous besoin de LayoutInflater

  • Le moment le plus courant que la plupart des gens utilisent est dans un RecyclerView. (Voir ces RecyclerViewexemples pour une liste ou une grille .) Vous devez gonfler une nouvelle disposition pour chaque élément visible dans la liste ou la grille.
  • Vous pouvez également utiliser un gonfleur de disposition si vous avez une disposition complexe que vous souhaitez ajouter par programme (comme nous l'avons fait dans notre exemple). Vous pouvez tout faire dans le code, mais il est beaucoup plus facile de le définir d'abord en xml puis de le gonfler.
Suragch
la source
22
Une explication bien meilleure que la réponse indiquée comme la solution. Parfois, la vie n'est pas juste.
Steve Wellens
Bonjour monsieur, Si j'ai plus d'une vue dans main_activity.xml, comment puis-je définir la vue external.xml dans main_activity avec center layout_gravity.
Prince
1
Ce devrait être la réponse acceptée. Si facile à comprendre pour tous les débutants.
M. Cold
Mylayout est-il un type View ou LinearLayout?
HS Singh
@HSSingh, myLayoutest une vue, bien que j'aurais pu la gonfler en tant que RelativeLayout (voir my_layout.xml). Après l'avoir gonflé, je l'ajoute en tant que sous-vue du parent LinearLayout (c'est-à-dire mainLayout).
Suragch
31

LayoutInflater.inflate () fournit un moyen de convertir un fichier res / layout / *. Xml définissant une vue en un objet View réel utilisable dans le code source de votre application.

deux étapes de base: obtenir le gonfleur, puis gonfler la ressource

Comment obtenez-vous le gonfleur?

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

Comment obtenez-vous la vue en supposant que le fichier xml est "list_item.xml"?

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

Voici un autre exemple similaire au précédent, mais étendu pour démontrer davantage les paramètres de gonflement et le comportement dynamique qu'il peut fournir.

Supposons que la disposition de vos lignes ListView puisse avoir un nombre variable de TextViews. Donc, vous gonflez d'abord la vue de l'élément de base (comme dans l'exemple précédent), puis bouclez en ajoutant dynamiquement TextViews au moment de l'exécution. En utilisant Android: layout_weight aligne également parfaitement tout.

Voici les ressources 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"/>

Remplacer la méthode getView dans l'extension de la classe 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;
}

Notez différents appels de méthode de gonflage:

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
la source
12

Cette classe est utilisée pour instancier un fichier XML de mise en page dans ses Viewobjets correspondants . Il ne doit jamais être utilisé directement - utilisez getLayoutInflater()ou getSystemService(String)pour récupérer une LayoutInflaterinstance standard qui est déjà connectée au contexte actuel et correctement configurée pour le périphérique sur lequel vous exécutez. Par exemple:

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

Référence: http://developer.android.com/reference/android/view/LayoutInflater.html

Abhishek Singh Rathaur
la source
2
Cela peut être vrai mais ne répond pas à la question.
Sinthia V
8

Gonfler signifie lire le fichier XML qui décrit une mise en page (ou élément GUI) et créer les objets réels qui lui correspondent, et ainsi rendre l'objet visible dans une application Android.

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

Ce fichier a pu être enregistré sous 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>

Ce fichier a pu être enregistré sous 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>

La MainActivityclasse enregistrée sous 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();
            }
        });
    }
}
Jijo
la source
6

Quel gonfleur fait

Il prend une disposition xml en entrée (par exemple) et la convertit en objet View.

Pourquoi besoin

Imaginons un scénario dans lequel nous devons créer une liste personnalisée. Maintenant, chaque ligne doit être personnalisée. Mais comment pouvons-nous le faire. Il n'est pas possible d'affecter une disposition xml à une ligne de listview. Nous créons donc un objet View. Ainsi, nous pouvons accéder aux éléments qu'il contient (textview, imageview etc.) et également affecter l'objet comme ligne de listview

Donc, chaque fois que nous devons assigner un objet de type vue quelque part et que nous avons notre conception xml personnalisée, nous le convertissons simplement en objet par gonfleur et nous l'utilisons.

Zahan Safallwa
la source
Alors, Monsieur Zahan, est-ce comme le DOM en Javascript? • o •
Jeancarlo Fontalvo
6

LayoutInflater est une classe utilisée pour instancier un fichier XML de disposition dans ses objets de vue correspondants qui peuvent être utilisés dans des programmes Java. En termes simples, il existe deux façons de créer une interface utilisateur dans Android. L'une est une méthode statique et une autre est dynamique ou programmatique. Supposons que nous ayons une mise en page simple main.xml ayant un textviewet un edittextcomme suit.

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

Nous pouvons afficher cette disposition de manière statique en

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

Une manière dynamique de créer une vue signifie que la vue n'est pas mentionnée dans notre main.xml, mais nous voulons l'afficher avec cela lors de l'exécution. Par exemple, nous avons un autre XML dans le dossier de disposition en tant que 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>

Nous voulons afficher cette zone de texte au moment de l'exécution dans notre interface utilisateur principale. Nous allons donc ici gonfler text.xml. Regarde comment:

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

Ici, j'ai utilisé getSystemService (String) pour récupérer une instance de LayoutInflater. Je peux aussi utiliser getLayoutInflator () pour gonfler au lieu d'utiliser getSystemService (String) comme ci-dessous:

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

voici un exemple pour obtenir une réfrence pour la vue racine d'une mise en page, la gonfler et l'utiliser avec setContentView (vue View)

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


}
Gal Rom
la source
1

L'inflateur de mise en page est une classe qui lit la description de l'apparence xml et les convertit en objets View basés sur java.

Muhammed Shibin
la source
0

ma liste de personnalisation espère qu'elle illustre le concept

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
la source
0

LayoutInflater est un composant fondamental d'Android. Vous devez l'utiliser tout le temps pour transformer des fichiers xml en hiérarchies de vues.

vishwas
la source
0

LayoutInflater crée des objets View basés sur des dispositions définies en XML. Il existe plusieurs façons d'utiliser LayoutInflater, notamment la création de vues personnalisées, le gonflement des vues de fragment dans les vues d'activité, la création de boîtes de dialogue ou simplement le gonflement d'une vue de fichier de disposition dans une activité.

Il existe de nombreuses idées fausses sur le fonctionnement du processus d'inflation. Je pense que cela vient de la mauvaise documentation de la méthode inflate (). Si vous souhaitez en savoir plus sur la méthode inflate () en détail, j'ai écrit un blog à ce sujet ici:

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

seanjfarrell
la source
0

Gonflez en fait une sorte de conversion en données, vues, instances, en représentation d'interface utilisateur visible .. ..il utilise alors le flux de données de peut-être des adaptateurs, etc. par programme. puis l'intégrer à un xml que vous avez défini, qui lui indique comment les données doivent être représentées dans l'interface utilisateur


la source