LayoutInflater ใน Android ทำอะไร


คำตอบ:


165

เมื่อคุณใช้มุมมองที่กำหนดเองในListViewคุณจะต้องกำหนดเค้าโครงแถว คุณสร้าง xml ที่คุณวางวิดเจ็ต Android และจากนั้นในรหัสของอะแดปเตอร์คุณต้องทำสิ่งนี้:

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 ลงจะดีกว่า
James Ko

4
นี่ไม่ได้อธิบายว่า LayoutInflater คืออะไร มันอธิบายถึงวิธีการใช้งาน
Donato

1
ฉันกำลังมองหาคำอธิบายของ LayoutInflater
PLAYER1

@ Player1 คุณสามารถตรวจสอบโพสต์นี้
Bertram Gilfoyle

282

LayoutInflaterชั้นจะใช้ในการยกตัวอย่างเนื้อหาของไฟล์รูปแบบ XML ลงสอดคล้องกันดูวัตถุของพวกเขา

กล่าวอีกนัยหนึ่งมันใช้ไฟล์ XML เป็นอินพุตและสร้างมุมมองวัตถุจากมัน


74
สิ่งที่ฉันกำลังมองหาคือส่วน "ในคำอื่น ๆ " เนื่องจากส่วนบนอยู่ในเอกสาร API อยู่แล้ว
Nipuna

1
นี่ก็ยังดูเป็นนามธรรมสำหรับฉัน ดังนั้นขอบอกว่าผมมีไฟล์สำหรับสายของแต่ละsingle_list_item.xml ListViewการใช้งานของไฟล์ XML นั้นเป็นเหมือนตัวสร้างแรงกดดันหรือไม่?
JohnK

167

อะไรLayoutInflatorทำอย่างไร

เมื่อแรกเริ่มการเขียนโปรแกรม Android ของผมสับสนจริงๆโดยและLayoutInflater findViewByIdบางครั้งเราใช้อย่างใดอย่างหนึ่งและบางครั้งอื่น ๆ

  • LayoutInflaterใช้เพื่อสร้างวัตถุใหม่View(หรือLayout) จากหนึ่งในเลย์เอาต์ xml ของคุณ
  • findViewByIdเพียงให้การอ้างอิงไปยังมุมมองที่สร้างไว้แล้ว คุณอาจคิดว่าคุณไม่ได้สร้างมุมมองใด ๆ เลย แต่เมื่อใดก็ตามที่คุณโทรsetContentViewในonCreateรูปแบบของกิจกรรมพร้อมกับ subviews ของตนได้รับการพอง (สร้าง) อยู่เบื้องหลัง

findViewByIdดังนั้นถ้ามุมมองที่มีอยู่แล้วให้ใช้แล้ว LayoutInflaterถ้าไม่ได้แล้วสร้างมันด้วย

ตัวอย่าง

นี่คือโปรเจ็กต์ขนาดเล็กที่ฉันทำซึ่งแสดงให้เห็นทั้งในLayoutInflaterและfindViewByIdในทางปฏิบัติ ไม่มีรหัสพิเศษเค้าโครงจะมีลักษณะเช่นนี้

ป้อนคำอธิบายรูปภาพที่นี่

สี่เหลี่ยมสีฟ้าเป็นรูปแบบที่กำหนดเองแทรกลงในเค้าโครงหลักด้วย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ตัวอย่างเหล่านี้สำหรับรายการหรือตาราง ) คุณต้องขยายเลย์เอาต์ใหม่สำหรับทุกรายการที่มองเห็นได้ในรายการหรือตาราง
  • นอกจากนี้คุณยังสามารถใช้รูปแบบ inflater ถ้าคุณมีเค้าโครงที่ซับซ้อนที่คุณต้องการเพิ่มโดยทางโปรแกรม (เช่นที่เราทำในตัวอย่างของเรา) คุณสามารถทำมันทั้งหมดด้วยโค้ด แต่มันง่ายกว่าที่จะนิยามมันใน xml ก่อนแล้วค่อยขยายมัน

20
คำอธิบายที่ดีกว่าคำตอบที่ระบุว่าเป็นวิธีแก้ปัญหา บางครั้งชีวิตก็ไม่ยุติธรรม
Steve Wellens

สวัสดีครับ, ถ้าฉันมีมากกว่าหนึ่งมุมมองใน main_activity.xml, ฉันจะตั้งค่ามุมมอง external.xml ใน main_activity ด้วย center layout_gravity ได้อย่างไร
เจ้าชาย

นี่ควรเป็นคำตอบที่ยอมรับได้ ง่ายต่อการเข้าใจสำหรับผู้เริ่มต้น
นายเย็น

mylayout เป็นประเภทการดูหรือเป็น LinearLayout หรือไม่
HS Singh

@HSSingh myLayoutเป็นมุมมองแม้ว่าฉันอาจทำให้พองได้ว่าเป็น RelativeLayout (ดู my_layout.xml) หลังจากที่ขยายเกินจริงฉันเพิ่มมันเป็นมุมมองย่อยของผู้ปกครอง LinearLayout (นั่นคือmainLayout)
Suragch

31

LayoutInflater.inflate () เป็นเครื่องมือในการแปลงไฟล์ res / layout / * .xml ที่กำหนดมุมมองให้เป็นวัตถุมุมมองจริงที่ใช้งานได้ในซอร์สโค้ดแอปพลิเคชันของคุณ

พื้นฐานสองขั้นตอน: รับลมแรงแล้วขยายตัวทรัพยากร

คุณจะได้รับลมแรงได้อย่างไร

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 ของคุณสามารถมีจำนวนตัวแปรของ TextViews ดังนั้นก่อนอื่นคุณขยายมุมมองรายการหลัก (เช่นเดียวกับตัวอย่างก่อนหน้า) จากนั้นวนซ้ำเพิ่ม TextViews ในเวลาทำงาน ใช้ 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"/>

แทนที่เมธอดgetViewในส่วนขยายของคลาส 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;
}

หมายเหตุการเรียกเมธอด inflate อื่น:

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

การขยายหมายถึงการอ่านไฟล์ XML ที่อธิบายเค้าโครง (หรือองค์ประกอบ GUI) และเพื่อสร้างวัตถุจริงที่สอดคล้องกับมันและทำให้วัตถุนั้นสามารถมองเห็นได้ภายในแอป 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 เป็นอินพุต (พูด) และแปลงเป็นวัตถุมุมมอง

ทำไมถึงจำเป็น

ให้เราคิดสถานการณ์ที่เราต้องสร้าง listview ที่กำหนดเอง ตอนนี้แต่ละแถวควรกำหนดเอง แต่เราจะทำอย่างไร ไม่สามารถกำหนดเค้าโครง xml ให้กับแถว listview ได้ ดังนั้นเราจึงสร้างวัตถุมุมมอง ดังนั้นเราสามารถเข้าถึงองค์ประกอบในนั้น (textview, imageview ฯลฯ ) และยังกำหนดวัตถุเป็นแถวของ listview

ดังนั้นเมื่อใดก็ตามที่เราจำเป็นต้องกำหนดประเภทวัตถุมุมมองที่ไหนสักแห่งและเรามีการออกแบบ xml ที่กำหนดเองของเราเราเพียงแค่แปลงเป็นวัตถุโดยพองตัวและใช้มัน


ดังนั้น Mister Zahan เป็นเหมือน DOM ใน Javascript หรือไม่ • o •
Jeancarlo Fontalvo

6

LayoutInflaterเป็นคลาสที่ใช้ในการสร้างอินสแตนซ์ไฟล์ XML ลงในวัตถุมุมมองที่สอดคล้องกันซึ่งสามารถใช้ในโปรแกรม Java กล่าวง่ายๆคือมีสองวิธีในการสร้าง UI ใน Android หนึ่งคือวิธีที่คงที่และอื่น ๆ เป็นแบบไดนามิกหรือทางโปรแกรม สมมติว่าเรามี main.xml เลย์เอาต์แบบง่ายมีหนึ่งtextviewและหนึ่งedittextดังต่อไปนี้

<?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 ของเรา แต่เราต้องการที่จะแสดงสิ่งนี้ในเวลาทำงาน ตัวอย่างเช่นเรามี XML อื่นในโฟลเดอร์เลย์เอาต์เป็น 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>

เราต้องการแสดงกล่องข้อความนี้ในเวลาทำงานภายใน 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 ฉันสามารถใช้ getLayoutInflator () ด้วยเพื่อขยายแทนการใช้ getSystemService (String) เช่นด้านล่าง:

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

5

นี่คือตัวอย่างสำหรับการรับการอ้างอิงสำหรับรูทมุมมองของเลย์เอาต์ขยายและใช้กับ setContentView (ดูมุมมอง)

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


}


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 มีหลายวิธีในการใช้ LayoutInflater รวมถึงการสร้างมุมมองที่กำหนดเองการขยายมุมมองแฟรกเมนต์ไปยังมุมมองกิจกรรมการสร้างไดอะล็อกหรือการขยายมุมมองไฟล์เลย์เอาต์ในกิจกรรม

มีความเข้าใจผิดมากมายเกี่ยวกับกระบวนการเงินเฟ้อว่าทำงานอย่างไร ฉันคิดว่าสิ่งนี้มาจากเอกสารที่ไม่ดีสำหรับวิธีพอง () หากคุณต้องการเรียนรู้เกี่ยวกับรายละเอียดวิธีการพอง () ฉันเขียนโพสต์บล็อกเกี่ยวกับมันที่นี่:

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


0

ที่จริงแล้ว Inflater นั้นมีการแปลงให้เป็นข้อมูล, มุมมอง, อินสแตนซ์, เป็นตัวแทน UI ที่มองเห็นได้ .. .. ดังนั้นมันจึงใช้ data feed จากอะแดปเตอร์ที่ใช้งานได้ ฯลฯ โดยทางโปรแกรม จากนั้นทำการรวมเข้ากับ xml ที่คุณกำหนดซึ่งจะบอกวิธีการแสดงข้อมูลใน UI

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.