Android의 LayoutInflater는 무엇을합니까?


답변:


165

에서 사용자 정의보기를 사용하는 ListView경우 행 레이아웃을 정의해야합니다. 안드로이드 위젯을 배치하는 xml을 만든 다음 어댑터의 코드에서 다음과 같이해야합니다.

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

공식 문서 에서 자세히 읽어보십시오 .


23
이상적으로 자원을 재활용 할 수 있는지 확인하기 위해 먼저 convertView를 테스트해야합니다.View view = convertView; if (view == null) { view = mInflater.... }
Jannie Theunissen

12
나는이 대답이 실제로 그것이 무엇인지 설명하지 LayoutInflater않지만 그것을 사용하는 곳을 설명한다고 생각하지 않습니다 . 답변 1-down이 더 좋습니다.
James Ko

4
LayoutInflater가 무엇인지 설명하지 않습니다. 사용법을 설명합니다.
Donato

1
LayoutInflater에 대한 설명을 찾고 있습니다.
Player

@ Player1 게시물을 확인할 수 있습니다
Bertram Gilfoyle

282

위해 LayoutInflater 클래스는 그에 상응하는 뷰 객체로 레이아웃 XML 파일의 내용을 인스턴스화하는 데 사용됩니다.

즉, XML 파일을 입력으로 사용하여 View 객체를 빌드합니다.


74
상단 부분이 이미 API 문서에 있기 때문에 내가 찾던 것은 "다른 말로"부분입니다.
Nipuna

1
이것은 여전히 ​​나에게 추상적입니다. 따라서 single_list_item.xml의 각 줄에 대한 파일 이 있다고 가정 해 봅시다 ListView. XML 파일을 사용하는 것이 팽창기와 비슷합니까?
JohnK

167

무엇을 LayoutInflator합니까?

처음 Android 프로그래밍을 시작했을 때 LayoutInflaterand 에 정말 혼란 스러웠습니다 findViewById. 때때로 우리는 때때로 하나를 사용했습니다.

  • LayoutInflaterxml 레이아웃 중 하나에서 새 View(또는 Layout) 객체 를 만드는 데 사용됩니다 .
  • findViewById이미 작성된 것보다보기에 대한 참조를 제공합니다. 당신은 당신이 아직 뷰를 작성하지 않은 것으로 생각할 수도 있지만, 전화 할 때마다 setContentView에서 onCreate, 서브 뷰와 함께 활동의 레이아웃은 무대 뒤에서 팽창 (생성)됩니다.

따라서 뷰가 이미 존재하면를 사용하십시오 findViewById. 그렇지 않은 경우을 사용하여 만드십시오 LayoutInflater.

여기에 내가 모두 그 프로그램을 만든 미니 프로젝트 LayoutInflaterfindViewById행동은. 특수 코드가 없으면 레이아웃은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

파란색 사각형은 기본 레이아웃에 삽입 된 사용자 정의 레이아웃입니다 include(자세한 내용은 여기 참조). 컨텐츠보기의 일부이므로 자동으로 팽창되었습니다. 보시다시피 코드에는 특별한 것이 없습니다.

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

이제 사용자 정의 레이아웃의 다른 사본을 부풀려서 추가합시다.

여기에 이미지 설명을 입력하십시오

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

새보기 레이아웃을 부풀리기 위해 팽창기에 XML 파일의 이름 ( my_layout), 추가하려는 부모 레이아웃 ( mainLayout) 및 실제로 추가하고 싶지 않다고 말하면됩니다 ( false) . 부모도로 설정할 수 null있지만 사용자 정의 레이아웃 루트보기의 레이아웃 매개 변수는 무시됩니다.

여기 다시 문맥에 있습니다.

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

findViewById레이아웃이 이미 팽창 된 후에 만 어떻게 사용 되는지 주목하십시오 .

보충 코드

위 예제의 xml은 다음과 같습니다.

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>

언제 LayoutInflater가 필요합니까

  • 대부분의 사람들이 사용하는 가장 일반적인 시간은입니다 RecyclerView. ( 목록 또는 그리드에 대해서는이 RecyclerView예제를 참조하십시오 .) 목록 또는 그리드에서 표시되는 모든 단일 항목에 대해 새 레이아웃을 팽창시켜야합니다.
  • 프로그래밍 방식으로 추가하려는 복잡한 레이아웃이있는 경우 레이아웃 팽창기를 사용할 수도 있습니다 (예에서와 같이). 코드에서 모두 할 수 있지만 먼저 xml로 정의한 다음 팽창시키는 것이 훨씬 쉽습니다.

20
솔루션으로 표시된 답변보다 훨씬 더 나은 설명. 때때로 인생은 공평하지 않습니다.
Steve Wellens

안녕하세요, main_activity.xml 내에 하나 이상의보기가있는 경우 어떻게 main_activity에서 center_ layout_gravity를 사용하여 external.xml보기를 설정할 수 있습니까?
프린스

이것은 정답입니다. 초보자도 쉽게 이해할 수 있습니다.
Mr Cold

mylayout은 View 유형입니까 아니면 LinearLayout 유형입니까?
HS Singh

@HSSingh myLayout는 View이지만 RelativeLayout으로 팽창시킬 수는 있습니다 (my_layout.xml 참조). 팽창 된 후에는 LinearLayout 부모의 하위보기 (즉, mainLayout)로 추가합니다.
Suragch

31

LayoutInflater.inflate ()는 뷰를 정의하는 res / layout / *. xml 파일을 응용 프로그램 소스 코드에서 사용할 수있는 실제 View 객체로 변환하는 수단을 제공합니다.

기본 두 단계 : 인플레이터를 확보 한 후 자원을 부풀려

팽창기를 어떻게 얻습니까?

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

xml 파일이 "list_item.xml"이라고 가정하면 어떻게 볼 수 있습니까?

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

22

다음은 이전 예제와 유사하지만 팽창 매개 변수 및 제공 할 수있는 동적 동작을 추가로 보여주기 위해 확장 된 예입니다.

ListView 행 레이아웃에 가변 개수의 TextView가있을 수 있다고 가정하십시오. 따라서 먼저 이전 항목과 같이 기본 항목 View를 확장 한 다음 런타임에 TextView를 동적으로 추가하여 루프합니다. android : layout_weight를 사용하면 모든 것이 완벽하게 정렬됩니다.

레이아웃 리소스는 다음과 같습니다.

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

BaseAdapter 클래스 확장에서 getView 메소드 대체

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

다른 팽창 방법 호출에 유의하십시오 .

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

이 클래스는 레이아웃 XML 파일을 해당 View객체 로 인스턴스화하는 데 사용됩니다 . 직접 사용되지는 않습니다 . 현재 컨텍스트에 이미 연결되어 있고 실행중인 장치에 대해 올바르게 구성된 표준 인스턴스를 사용 getLayoutInflater()하거나 getSystemService(String)검색하는 데 사용되지 않습니다 LayoutInflater. 예를 들면 다음과 같습니다.

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

참조 : http://developer.android.com/reference/android/view/LayoutInflater.html


2
이것은 사실 일 수 있지만 질문에 대답하지는 않습니다.
Sinthia V

8

팽창은 레이아웃 (또는 GUI 요소)을 설명하는 XML 파일을 읽고 이에 해당하는 실제 객체를 생성하여 객체를 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);

이 파일은 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>

이 파일은 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>

MainActivity로 저장 클래스 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

팽창기의 기능

xml 레이아웃을 입력으로 사용하여 View 객체로 변환합니다.

왜 필요한가

커스텀리스트 뷰를 만들어야하는 시나리오를 생각해 보자. 이제 각 행은 사용자 정의되어야합니다. 그러나 어떻게 할 수 있습니까? xml 레이아웃을 listview 행에 할당 할 수 없습니다. 따라서 View 객체를 만듭니다. 따라서 우리는 그 안에있는 요소 (textview, imageview 등)에 액세스하고 객체를 listview의 행으로 할당 할 수 있습니다

따라서 뷰 유형 객체를 어딘가에 할당해야 할 때마다 사용자 정의 XML 디자인이 있으면 팽창기로 객체로 변환하고 사용하기 만하면됩니다.


자한 자매님, 자바 스크립트의 DOM과 같은가요? • o •
Jeancarlo Fontalvo 2016

6

LayoutInflater 는 레이아웃 XML 파일을 Java 프로그램에서 사용할 수있는 해당 뷰 객체로 인스턴스화하는 데 사용되는 클래스입니다. 간단히 말해서 안드로이드에서 UI를 만드는 두 가지 방법이 있습니다. 하나는 정적 인 방법이고 다른 하나는 동적이거나 프로그래밍 방식입니다. 다음과 같이 하나 textview와 하나 edittext를 갖는 간단한 레이아웃 main.xml이 있다고 가정하십시오 .

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

이 레이아웃을 정적으로 표시 할 수 있습니다

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

뷰를 생성하는 동적 방법은 main.xml에 뷰가 언급되어 있지 않지만 런타임에이를 표시하려고 함을 의미합니다. 예를 들어 레이아웃 폴더에 footer.xml과 같은 다른 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>

기본 UI 내에서이 텍스트 상자를 런타임에 표시하려고합니다. 여기에서 text.xml을 부 풀릴 것입니다. 방법보기 :

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

여기서는 getSystemService (String)를 사용하여 LayoutInflater 인스턴스를 검색했습니다. 다음과 같이 getSystemService (String)를 사용하는 대신 getLayoutInflator ()를 사용하여 팽창시킬 수도 있습니다.

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

5

다음은 레이아웃의 루트보기에 대한 굴절을 가져 와서 팽창시키고 setContentView (View view)와 함께 사용하는 예입니다

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는 xml 모양 설명을 읽고이를 Java 기반 View 객체로 변환하는 클래스입니다.


0

내 사용자 정의 목록은 개념을 설명하기를 바랍니다.

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는 Android의 기본 구성 요소입니다. xml 파일을보기 계층으로 변환하려면 항상 사용해야합니다.


0

LayoutInflater는 XML로 정의 된 레이아웃을 기반으로 View 객체를 만듭니다. 사용자 정의보기 작성, 조각보기를 활동보기로 팽창, 대화 상자 작성 또는 단순히 레이아웃 파일보기를 활동으로 팽창시키는 등 LayoutInflater를 사용하는 여러 가지 방법이 있습니다.

인플레이션 프로세스의 작동 방식에 대한 많은 오해가 있습니다. 나는 이것이 inflate () 메소드에 대한 문서가 부족하다고 생각합니다. inflate () 메소드에 대해 자세히 알고 싶다면 여기에 블로그 글을 작성했습니다.

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


0

Inflater는 실제로 일종의 데이터, 뷰, 인스턴스, 가시적 인 UI 표현으로 변환합니다. 따라서 아마도 어댑터 등의 데이터 피드를 프로그래밍 방식으로 사용합니다. 그런 다음 정의한 xml과 통합하여 UI에서 데이터를 표현하는 방법을 알려줍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.