Do czego służy LayoutInflater w systemie Android?


Odpowiedzi:


165

Kiedy używasz niestandardowego widoku w ListView, musisz zdefiniować układ wiersza. Tworzysz plik XML, w którym umieszczasz widżety Androida, a następnie w kodzie adaptera musisz zrobić coś takiego:

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

Przeczytaj więcej w oficjalnej dokumentacji .


23
Idealnie powinieneś najpierw przetestować convertView, aby zobaczyć, czy możesz poddać recyklingowi zasób, więcView view = convertView; if (view == null) { view = mInflater.... }
Jannie Theunissen

12
Nie sądzę, aby ta odpowiedź naprawdę wyjaśniała, czym LayoutInflaterjest a , chociaż wyjaśnia, gdzie jej użyć. Odpowiedź 1-dół jest lepsza.
James Ko

4
To nie wyjaśnia, co to jest LayoutInflater. Wyjaśnia, jak go używać.
Donato,

1
Szukam wyjaśnienia dla LayoutInflater.
Gracz1

@ Player1 Możesz sprawdzić ten post
Bertram Gilfoyle,

282

The LayoutInflater klasa służy do wystąpienia zawartości plików XML układ do ich odpowiednich Zobacz obiektów.

Innymi słowy, pobiera plik XML jako dane wejściowe i buduje z niego obiekty View.


74
To, czego szukałem, to część „innymi słowy”, ponieważ górna część jest już w dokumentach API
Nipuna

1
To wciąż wydaje mi się dość abstrakcyjne. Powiedzmy, że mam single_list_item.xmlplik dla każdej linii ListView. Czy użycie tego pliku XML jest jak inflator?
JohnK

167

Co ma LayoutInflatorzrobić?

Kiedy zaczynałem programować na Androida, byłem naprawdę zdezorientowany przez LayoutInflateri findViewById. Czasami używaliśmy jednego, a czasem drugiego.

  • LayoutInflatersłuży do tworzenia nowego View(lub Layout) obiektu z jednego z układów xml.
  • findViewByIdpo prostu daje odniesienie do widoku, który został już utworzony. Można by pomyśleć, że nie utworzono jeszcze żadnych poglądów, ale gdy nazywasz setContentViewsię onCreate, układ aktywności użytkownika wraz z jego subviews zostanie nadmuchany (stworzony) za kulisami.

Więc jeśli widok już istnieje, użyj findViewById. Jeśli nie, utwórz go za pomocąLayoutInflater .

Przykład

Oto mój mały projekt, który pokazuje zarówno w akcji, jak LayoutInflateri findViewByIdw akcji. Bez specjalnego kodu układ wygląda następująco.

wprowadź opis zdjęcia tutaj

Niebieski kwadrat to niestandardowy układ wstawiony do głównego układu za pomocą include(patrz tutaj, aby uzyskać więcej). Został on zawyżony automatycznie, ponieważ jest częścią widoku zawartości. Jak widać, w kodzie nie ma nic specjalnego.

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

Teraz napompujmy (utwórz) kolejną kopię naszego niestandardowego układu i dodaj go.

wprowadź opis zdjęcia tutaj

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

Aby napompować nowy układ widoku, wszystko, co zrobiłem, to powiedzieć inflatorowi nazwę mojego pliku xml ( my_layout), układ nadrzędny, do którego chcę go dodać ( mainLayout), i że tak naprawdę nie chcę go jeszcze dodawać ( false) . (Mógłbym również ustawić element nadrzędny na null, ale wówczas parametry układu widoku głównego mojego niestandardowego układu zostaną zignorowane).

Tutaj znów jest w kontekście.

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

Zauważ, że findViewByIdjest używany tylko po zawyżeniu układu.

Kod uzupełniający

Oto xml dla powyższego przykładu.

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>

Kiedy potrzebujesz LayoutInflater

  • Najczęściej ludzie używają go w RecyclerView. (Zobacz te RecyclerViewprzykłady, aby uzyskać listę lub siatkę .) Musisz nadmuchać nowy układ dla każdego widocznego elementu na liście lub siatce.
  • Możesz także użyć inflatora układu, jeśli masz złożony układ, który chcesz dodać programowo (tak jak w naszym przykładzie). Możesz zrobić to wszystko w kodzie, ale o wiele łatwiej jest najpierw zdefiniować go w XML, a następnie po prostu go napompować.

20
Znacznie lepsze wytłumaczenie niż odpowiedź oznaczona jako rozwiązanie. Czasami życie po prostu nie jest sprawiedliwe.
Steve Wellens,

Witam pana, jeśli mam więcej niż jeden widok w main_activity.xml, to jak mogę ustawić widok external.xml w main_activity z centrum układ_grawitacji.
Książę

To powinna być zaakceptowana odpowiedź. Tak łatwy do zrozumienia dla każdego początkującego.
Mr Cold

Czy mylayout jest typem widoku czy typem liniowym?
HS Singh,

@HSSingh, myLayoutto widok, chociaż mogłem go zawyżać jako RelativeLayout (patrz my_layout.xml). Po nadmuchaniu dodaję go jako widok podrzędny elementu nadrzędnego LinearLayout (to znaczy mainLayout).
Suragch

31

LayoutInflater.inflate () zapewnia sposób na konwersję pliku res / layout / *. Xml definiującego widok na rzeczywisty obiekt View możliwy do użycia w kodzie źródłowym aplikacji.

podstawowe dwa kroki: zdobądź inflator, a następnie napompuj zasób

Jak zdobyć inflator?

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

Jak uzyskać widok przy założeniu, że plik xml to „list_item.xml”?

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

22

Oto kolejny przykład podobny do poprzedniego, ale rozszerzony w celu dalszego wykazania parametrów nadmuchiwania i zachowania dynamicznego, które może zapewnić.

Załóżmy, że układ wiersza ListView może mieć zmienną liczbę TextView. Najpierw napompujesz element podstawowy Widok (tak jak w poprzednim przykładzie), a następnie zapętlisz dynamicznie dodając TextViews w czasie wykonywania. Korzystanie z Androida: layout_weight dodatkowo wszystko idealnie wyrównuje.

Oto zasoby 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"/>

Przesłoń metodę getView w rozszerzeniu klasy 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;
}

Zwróć uwagę na różne wywołania metody inflacji:

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

12

Ta klasa służy do tworzenia pliku XML układu w odpowiadających mu Viewobiektach. Nigdy nie można go używać bezpośrednio - użyj getLayoutInflater()lub getSystemService(String)pobierz standardową LayoutInflaterinstancję, która jest już podłączona do bieżącego kontekstu i poprawnie skonfigurowana dla urządzenia, na którym pracujesz. Na przykład:

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

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


2
To może być prawda, ale nie odpowiada na pytanie.
Sinthia V

8

Napompowanie oznacza odczytanie pliku XML opisującego układ (lub element GUI) i utworzenie rzeczywistych obiektów, które mu odpowiadają, a tym samym uczynienie obiektu widocznym w aplikacji na Androida.

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

Ten plik można zapisać jako 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>

Ten plik można zapisać jako 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>

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

6

Co robi inflator

Pobiera układ xml jako dane wejściowe (powiedzmy) i konwertuje go na obiekt View.

Dlaczego potrzebny

Pomyślmy o scenariuszu, w którym musimy stworzyć niestandardowy widok listy. Teraz każdy wiersz powinien być niestandardowy. Ale jak możemy to zrobić. Nie można przypisać układu xml do wiersza widoku listy. Tworzymy obiekt View. W ten sposób możemy uzyskać dostęp do elementów w nim zawartych (widok tekstu, widok obrazu itp.), A także przypisać obiekt jako wiersz widoku listy

Tak więc, ilekroć musimy gdzieś przypisać obiekt typu widoku i mamy nasz niestandardowy projekt xml, po prostu przekształcamy go w obiekt przez inflator i używamy go.


Więc, panie Zahan, czy to jest DOM w Javascript? • o •
Jeancarlo Fontalvo,

6

LayoutInflater to klasa używana do tworzenia instancji pliku XML układu w odpowiadających mu obiektach widoku, które mogą być używane w programach Java. Mówiąc prościej, istnieją dwa sposoby tworzenia interfejsu użytkownika w Androidzie. Jeden jest statyczny, a drugi dynamiczny lub programowo. Załóżmy, że mamy prosty układ main.xml mający jeden textviewi jeden edittextw następujący sposób.

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

Możemy wyświetlić ten układ w sposób statyczny

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

Dynamiczny sposób tworzenia widoku oznacza, że ​​widok nie jest wspomniany w naszym pliku main.xml, ale chcemy to pokazać w czasie wykonywania. Na przykład mamy inny plik XML w folderze układu jako 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>

Chcemy pokazać to pole tekstowe w czasie wykonywania w naszym głównym interfejsie użytkownika. Więc tutaj napompujemy text.xml. Zobacz jak:

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

Tutaj użyłem getSystemService (String), aby pobrać instancję LayoutInflater. Mogę również użyć metody getLayoutInflator (), aby napompować, zamiast metody getSystemService (String), jak poniżej:

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

5

oto przykład uzyskiwania odwołania do widoku głównego układu, nadmuchiwania go i używania go z setContentView (widok widoku)

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


}

1

Layout inflater to klasa, która odczytuje opis wyglądu xml i przekształca je w obiekty widoku oparte na Javie.


0

moja lista dostosowań ma nadzieję, że ilustruje koncepcję

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

}

}

0

LayoutInflater jest podstawowym składnikiem Androida. Musisz go cały czas używać do przekształcania plików XML w hierarchie widoków.


0

LayoutInflater tworzy obiekty View na podstawie układów zdefiniowanych w XML. Istnieje kilka różnych sposobów korzystania z LayoutInflater, w tym tworzenie niestandardowych widoków, nadmuchiwanie widoków fragmentów do widoków działań, tworzenie okien dialogowych lub po prostu nadmuchiwanie pliku układu widok do działania.

Istnieje wiele nieporozumień na temat tego, jak działa proces inflacji. Myślę, że wynika to z braku dokumentacji dla metody inflate (). Jeśli chcesz dowiedzieć się więcej o metodzie inflate (), napisałem o tym post na blogu:

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


0

Inflater w rzeczywistości konwertuje dane, widoki, instancje, na widoczną reprezentację interfejsu użytkownika .. .. wykorzystuje programowo przesył danych do być może adapterów itp. następnie integrując go ze zdefiniowanym plikiem XML, który mówi, jak dane powinny być reprezentowane w interfejsie użytkownika

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.