LayoutInflater
有什么用途?#1 楼
在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;
}
阅读更多官方文档。
评论
理想情况下,您应该首先测试convertView以查看是否可以回收资源,因此View view = convertView; if(view == null){view = mInflater ....}
–珍妮(Jannie Theunissen)
13年3月22日在12:32
我认为这个答案不能真正说明LayoutInflater是什么,尽管它说明了在哪里使用它。 1-down的答案更好。
–James Ko
17年6月8日在16:43
这没有解释什么是LayoutInflater。它说明了如何使用它。
–多纳托
17年7月14日在21:41
我正在寻找LayoutInflater的解释。
–Player1
18年1月1日在22:59
@ Player1您可以查看此帖子
–贝尔特拉姆·吉尔福伊尔(Bertram Gilfoyle)
18年8月11日在6:48
#2 楼
LayoutInflater类用于将布局XML文件的内容实例化为它们相应的View对象。换句话说,它将XML文件作为输入并从中构建View对象。
评论
我正在寻找的是“换句话说”部分,因为顶部已经在API文档中
– Nipuna
2011年7月27日在6:06
在我看来,这仍然很抽象。因此,假设我在ListView的每一行都有一个single_list_item.xml文件。该XML文件的使用是否有点像充气机?
– JohnK
2012年6月27日12:36
实际上,API文档说明了一切。实例化XML的内容就是精确的描述。有时我们对文本的阅读太深而忽略了明显的内容
– dp2050
12月22日,0:48
#3 楼
LayoutInflator
是做什么的?当我第一次开始Android编程时,我对
LayoutInflater
和findViewById
感到很困惑。有时我们使用一个,有时使用另一个。LayoutInflater
用于从您的xml布局之一创建新的View
(或Layout
)对象。findViewById
只是为您提供了已创建视图的引用。您可能会认为还没有创建任何视图,但是每当在setContentView
中调用onCreate
时,活动的布局及其子视图就会在后台变大(创建)。存在,然后使用findViewById
。如果不是,请使用LayoutInflater
创建它。示例
这是我制作的一个微型项目,它同时显示了
LayoutInflater
和findViewById
的运行情况。没有特殊代码,布局看起来像这样。蓝色正方形是使用
include
插入到主布局中的自定义布局(有关更多信息,请参见此处)。它是内容视图的一部分,因此已自动膨胀。如您所见,该代码没有什么特别之处。 > public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
要膨胀新的视图布局,我所做的只是告诉膨胀器xml文件的名称(
my_layout
),即父布局我想将其添加到(mainLayout
),而我实际上还不想添加它(false
)。 (我也可以将父级设置为null
,但是自定义布局的根视图的布局参数将被忽略。)这里还是上下文。
LayoutInflater inflater = getLayoutInflater();
View myLayout = inflater.inflate(R.layout.my_layout, mainLayout, false);
请注意仅在布局已经膨胀后如何使用
findViewById
。补充代码
这是上面示例的xml。
activity_main.xml
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);
}
}
my_layout.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>
什么时候需要LayoutInflater
大多数人最常用的时间是在
RecyclerView
中。 (有关列表或网格的信息,请参见这些RecyclerView
示例。)您必须为列表或网格中的每个可见项添加新的布局。如果您具有复杂的布局,也可以使用布局填充器想要以编程方式添加(就像我们在示例中所做的那样)。您可以在代码中完成所有操作,但是先在xml中定义然后再对其进行充气要容易得多。
评论
比标记为解决方案的答案好得多。有时生活不公平。
–史蒂夫·韦伦斯(Steve Wellens)
18年4月12日在4:10
您好先生,如果main_activity.xml中有一个以上的视图,那么我如何在main_activity中以center layout_gravity设置external.xml视图。
– Dholakiya王子
18年8月27日在6:02
这应该是公认的答案。对任何初学者来说都很容易理解。
– Cold先生
19年6月6日在10:09
mylayout是View类型还是LinearLayout类型?
–HS Singh
19-10-6在5:02
@ HSSingh,myLayout是一个View,尽管我可以将其夸大为RelativeLayout(请参见my_layout.xml)。膨胀后,我将其添加为LinearLayout父级(即mainLayout)的子视图。
– Suragch
19-10-7在0:51
#4 楼
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);
#5 楼
这是另一个与前一个示例相似的示例,但已扩展为进一步演示它可以提供的膨胀参数和动态行为。因此,首先您需要为基础项目View充气(就像前面的示例一样),然后在运行时循环动态添加TextView。另外,使用android:layout_weight可以完美对齐所有内容。以下是布局资源: > schedule_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>
在BaseAdapter类的扩展中覆盖getView方法
<?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"/>
请注意不同的充气方法电话:
@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;
}
#6 楼
此类用于将布局XML文件实例化为其相应的View
对象。永远不要直接使用它-使用getLayoutInflater()
或getSystemService(String)
检索标准的LayoutInflater
实例,该实例已经连接到当前上下文并已针对运行的设备正确配置。例如:LayoutInflater inflater = (LayoutInflater)context.getSystemService
(Context.LAYOUT_INFLATER_SERVICE);
参考:http://developer.android.com/reference/android/view/LayoutInflater.html
评论
这可能是正确的,但不能回答问题。
–辛西娅五世
13-10-15在15:11
#7 楼
膨胀意味着读取描述布局(或GUI元素)的XML文件并创建与之对应的实际对象,从而使该对象在Android应用程序中可见。此文件可以另存为date_time_dialog.xml:
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_picker.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>
MainActivity
类另存为MainActivity.java: <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>
#8 楼
充气器的作用它将xml布局作为输入(例如),并将其转换为View对象。
为什么需要
让我们考虑一下需要创建自定义列表视图的情况。现在每一行都应该是自定义的。但是我们该怎么做。无法将xml布局分配给listview的行。因此,我们创建了一个View对象。因此,我们可以访问其中的元素(textview,imageview等),也可以将对象分配为listview的行。
因此,每当我们需要在某处分配视图类型对象并拥有自定义xml设计时只需通过充气机将其转换为对象并使用即可。
评论
那么Zahan先生,它就像Javascript中的DOM一样吗? •o•
–扬卡洛·丰塔尔沃(Jeancarlo Fontalvo)
16 Dec 25 '15:03
#9 楼
LayoutInflater是一个类,用于将布局XML文件实例化为可在Java程序中使用的相应视图对象。简单来说,有两种方法可以在android中创建UI。一种是静态方式,另一种是动态方式或程序方式。
假设我们有一个简单的布局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>
动态创建视图的方式意味着该视图未在main.xml中提及,但我们想显示在运行时。例如,布局文件夹中还有另一个XML文件,即footer.xml
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
我们想在运行时在主UI中显示此文本框。因此,在这里我们将对text.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>
这里我使用了getSystemService(字符串)来检索LayoutInflater实例。我也可以使用getLayoutInflator()进行充气,而不是像下面这样使用getSystemService(String):
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);
#10 楼
这是获取布局的根视图的参考的示例,将其展开并与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);
}
#11 楼
LayoutInflater基于XML定义的布局创建View对象。有多种使用LayoutInflater的方法,包括创建自定义视图,将Fragment视图扩展到Activity视图,创建对话框,或简单地将布局文件View扩展到Activity中。通胀过程如何运作。我认为这是因为inflate()方法的文档不多。如果您想详细了解inflate()方法,我在这里写了一篇博客文章:https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate /
#12 楼
Layout Inflater是一个类,它读取xml外观描述并将其转换为基于Java的View对象。#13 楼
我的自定义列表希望能说明概念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;
}
}
}
评论
检查这是否有帮助。