سؤال

ما هي الفائدة من LayoutInflater في Android؟

هل كانت مفيدة؟

المحلول

عند استخدام طريقة عرض مخصصة في 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;
}

اقرأ المزيد في الوثائق الرسمية.

نصائح أخرى

layoutinflater يتم استخدام الفئة لتثبيت ملف XML تخطيط في كائنات العرض المقابلة الخاصة به.

بمعنى آخر ، يستغرق إدخال ملف XML وإنشاء كائنات العرض منه.

ماذا فعلت LayoutInflator فعل؟

عندما بدأت برمجة Android لأول مرة ، كنت مرتبكًا حقًا LayoutInflater و findViewById. في بعض الأحيان استخدمنا واحدًا وأحيانًا الآخر.

  • LayoutInflater يستخدم لإنشاء جديد View (أو Layout) كائن من أحد تخطيطات XML الخاصة بك.
  • findViewById يمنحك مجرد إشارة إلى عرض مما تم إنشاؤه بالفعل. قد تعتقد أنك لم تنشئ أي وجهات نظر حتى الآن ، ولكن كلما اتصلت setContentView في onCreate, ، يتضخم تخطيط النشاط جنبا إلى جنب مع آراءه الفرعية (تم إنشاؤه) خلف الكواليس.

لذلك إذا كان العرض موجود بالفعل ، فاستخدم findViewById. إذا لم يكن كذلك ، فقم بإنشائه باستخدام LayoutInflater.

مثال

هنا مشروع صغير قمت به والذي يعرض كلاهما LayoutInflater و findViewById في العمل. مع عدم وجود رمز خاص ، يبدو التخطيط هكذا.

enter image description here

المربع الأزرق عبارة عن تخطيط مخصص يتم إدخاله في التصميم الرئيسي مع include (نرى هنا للمزيد من). تم تضخيمه تلقائيًا لأنه جزء من عرض المحتوى. كما ترون ، لا يوجد شيء مميز حول الرمز.

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

الآن دعنا نضخّم (إنشاء) نسخة أخرى من التصميم المخصص لدينا وأضفها.

enter image description here

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

لتضخيم تخطيط العرض الجديد ، كل ما فعلته هو إخبار Inflater باسم ملف 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 أولاً ثم تضخيمه.

يوفر LayoutInflater.inflate () وسيلة لتحويل ملف الدقة/التخطيط/*.

خطوتين أساسيتين: احصل على المورد ثم تضخيم المورد

كيف تحصل على إيفاد؟

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

كيف يمكنك الحصول على العرض على افتراض أن ملف XML هو "list_item.xml"؟

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

فيما يلي مثال آخر مشابه للمثلي السابق ، ولكنه ممتد لإثبات معلمات تضخيم وسلوك ديناميكي يمكن أن توفره.

افترض أن تخطيط صف 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>

الجدول الزمني _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;
}

ملحوظة مكالمات طريقة نفخ مختلفة:

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

يتم استخدام هذه الفئة لتثبيت ملف XML تخطيط في المقابلة View أشياء. لا يتم استخدامه مباشرة - الاستخدام getLayoutInflater() أو getSystemService(String) لاسترداد معيار LayoutInflater مثال تم توصيله بالفعل بالسياق الحالي وتكوينه بشكل صحيح للجهاز الذي تقوم بتشغيله. فمثلا:

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

المرجعي: http://developer.android.com/reference/android/view/layoutinflater.html

يعني التضخم قراءة ملف 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();
            }
        });
    }
}

ماذا يفعل Inflater

يستغرق تخطيط XML كمدخل (على سبيل المثال) ويحوله لعرض الكائن.

لماذا مطلوب

دعنا نفكر في سيناريو حيث نحتاج إلى إنشاء عرض مخصص. الآن يجب أن يكون كل صف مخصصًا. ولكن كيف يمكننا أن نفعل ذلك. لا يمكن تعيين تخطيط XML إلى صف من ListView. لذلك ، نقوم بإنشاء كائن عرض. وبالتالي يمكننا الوصول إلى العناصر الموجودة في تكنولوجيا المعلومات (TextView ، ImageView إلخ) وكذلك تعيين الكائن كصف من ListView

لذلك ، كلما احتجنا إلى تعيين كائن نوع العرض في مكان ما ولدينا تصميم XML المخصص ، فنحن نقوم بتحويله إلى كائن عن طريق Inflater واستخدامه.

فيما يلي مثال على الحصول على امتناع عن عرض الجذر للتخطيط ، وتضخيمه واستخدامه باستخدام setContentView (عرض العرض)

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


}

layoutinflater هو فئة تستخدم لتثبيت ملف XML تخطيط في كائنات العرض المقابلة الخاصة به والتي يمكن استخدامها في برامج Java. بعبارات بسيطة ، هناك طريقتان لإنشاء واجهة المستخدم في Android. واحدة هي طريقة ثابتة والآخر ديناميكي أو برمجي. لنفترض أن لدينا تصميمًا بسيطًا. 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>

نريد أن نعرض مربع النص هذا في وقت التشغيل ضمن واجهة المستخدم الرئيسية لدينا. لذلك سنقوم هنا بتضخيم 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 (سلسلة) لاسترداد مثيل LayoutInflater. يمكنني استخدام getLayoutInflator () أيضًا لتضخيم بدلاً من استخدام GetSystemService (سلسلة) كما هو أدناه:

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

تخطيط Inflater هو فئة تقرأ وصف مظهر XML وتحويلها إلى كائنات عرض تعتمد على Java.

قائمة التخصيص الخاصة بي آمل أن توضح المفهوم

public class second extends ListActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.second);
//  TextView textview=(TextView)findViewById(R.id.textView1);
//  textview.setText(getIntent().getExtras().getString("value"));

    setListAdapter(new MyAdapter(this,R.layout.list_item,R.id.textView1, getResources().getStringArray(R.array.counteries)));
}

private class MyAdapter extends ArrayAdapter<String>{

    public MyAdapter(Context context, int resource, int textViewResourceId,
            String[] objects) {
        super(context, resource, textViewResourceId, objects);
        // TODO Auto-generated constructor stub
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row=inflater.inflate(R.layout.list_item,parent,false);
        String[]items=getResources().getStringArray(R.array.counteries);

        ImageView iv=(ImageView) row.findViewById(R.id.imageView1);
        TextView tv=(TextView) row.findViewById(R.id.textView1);
        tv.setText(items[position]);

        if(items[position].equals("unitedstates")){
            iv.setImageResource(R.drawable.usa);
        }else   if(items[position].equals("Russia")){
            iv.setImageResource(R.drawable.russia);
        }else   if(items[position].equals("Japan")){
            iv.setImageResource(R.drawable.japan);
        }
        // TODO Auto-generated method stub
        return row;
    }

}

}

LayoutInflater هو عنصر أساسي في Android. يجب استخدامه طوال الوقت لتحويل ملفات XML إلى التسلسلات الهرمية.

يخلق LayoutInflater كائنات عرض بناءً على تخطيطات محددة في XML. هناك العديد من الطرق المختلفة لاستخدام LayoutInflater ، بما في ذلك إنشاء طرق عرض مخصصة ، أو تضخيم طرق العرض الشظية في طرق عرض النشاط ، أو إنشاء مربعات حوار ، أو ببساطة تضخيم طريقة عرض ملف التخطيط في نشاط.

هناك الكثير من المفاهيم الخاطئة حول كيفية عمل عملية التضخم. أعتقد أن هذا يأتي من فقير الوثائق لطريقة تضخيم (). إذا كنت ترغب في التعرف على طريقة تضخيم () بالتفصيل ، كتبت منشور مدونة حولها هنا:

https://www.bignerdranch.com/blog/undergening-droids-layoutinflater-inflate/

inflater في الواقع نوع من التحويل إلى البيانات ، وجهات النظر ، الحالات ، إلى تمثيل واجهة المستخدم المرئية .. .. وهذا يستفيد من تغذية البيانات من المحولات ربما ، إلخ. ثم دمجه مع XML التي حددتها ، والتي تخبرها كيف ينبغي تمثيل البيانات في واجهة المستخدم

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top