Inflater英文意思是膨胀,在android中大概是扩展的意思吧。
LayoutInflater的作用类似于
findViewById(),不同点是LayoutInflater是用来找layout下xml布局文件,并且实例化!而
findViewById()是找具体xml下的具体 widget控件(如:Button,TextView等)。
它的用法有2种:
1
|
LayoutInflater inflater = LayoutInflater.from(
this
);
|
2
|
View view=inflater.inflate(R.layout.ID,
null
);
|
或者干脆并成一句:
1
|
View view=LayoutInflater.from(
this
).inflate(R.layout.ID,
null
);
|
另一种方法:
1
|
LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
|
2
|
View view=inflater.inflate(R.layout.ID,
null
);
|
上面2种方法本质上是一样的,看下面的源码,form()调用的就是getSystemService():
1
|
public
static
LayoutInflater from(Context context) {
|
2
|
LayoutInflater LayoutInflater =
|
3
|
(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
4
|
if
(LayoutInflater ==
null
) {
|
5
|
throw
new
AssertionError(
"LayoutInflater not found."
);
|
另外getSystemService()是Android很重要的一个API,它是Activity的一个方法,根据传入的NAME来取得对应的Object,然后转换成相应的服务对象。以下介绍系统相应的服务。
传入的Name |
返回的对象 |
说明 |
WINDOW_SERVICE |
WindowManager |
管理打开的窗口程序 |
LAYOUT_INFLATER_SERVICE |
LayoutInflater |
取得xml里定义的view |
ACTIVITY_SERVICE |
ActivityManager |
管理应用程序的系统状态 |
POWER_SERVICE |
PowerManger |
电源的服务 |
ALARM_SERVICE |
AlarmManager |
闹钟的服务 |
NOTIFICATION_SERVICE |
NotificationManager |
状态栏的服务 |
KEYGUARD_SERVICE |
KeyguardManager |
键盘锁的服务 |
LOCATION_SERVICE |
LocationManager |
位置的服务,如GPS |
SEARCH_SERVICE |
SearchManager |
搜索的服务 |
VEBRATOR_SERVICE |
Vebrator |
手机震动的服务 |
CONNECTIVITY_SERVICE |
Connectivity |
网络连接的服务 |
WIFI_SERVICE |
WifiManager |
Wi-Fi服务 |
TELEPHONY_SERVICE |
TeleponyManager |
电话服务 |
02
|
public
void
showCustomDialog(){
|
03
|
AlertDialog.Builder builder;
|
04
|
AlertDialog alertDialog;
|
05
|
Context mContext = AppActivity.
this
;
|
08
|
LayoutInflater inflater = (LayoutInflater)
|
09
|
mContext.getSystemService(LAYOUT_INFLATER_SERVICE);
|
10
|
View layout = inflater.inflate(R.layout.custom_dialog,
null
);
|
11
|
TextView text = (TextView) layout.findViewById(R.id.text);
|
12
|
text.setText(
"Hello, Welcome to Mr Wei's blog!"
);
|
13
|
ImageView image = (ImageView) layout.findViewById(R.id.image);
|
14
|
image.setImageResource(R.drawable.icon);
|
15
|
builder =
new
AlertDialog.Builder(mContext);
|
16
|
builder.setView(layout);
|
17
|
alertDialog = builder.create();
|
22
|
protected
void
showToast(
int
type) {
|
23
|
Toast.makeText(
this
,
"*********"
, Toast.LENGTH_LONG).show();
|
25
|
LayoutInflater li = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
|
26
|
View view = li.inflate(R.layout.toast,
null
);
|
28
|
Toast toast =
new
Toast(
this
);
|
30
|
toast.setDuration(type);
|
Android 动态加载布局
由于前段时间项目需要,需要在一个页面上加载根据不同的按钮加载不同的布局页面,当时想到用 tabhot 。不过美工提供的界面图完全用不上tabhot ,所以想到了动态加载的方法来解决这一需求。在这里我整理了一下,写了一个 DEMO 希望大家以后少走点弯路。
首先,我们先把界面的框架图画出来,示意图如下:
中间白色部门是一个线性布局文件,我喜欢在画图的时候用不同的颜色将一块布局标示出来,方便查看。布局文件代码如下:
01
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
|
03
|
android:orientation="vertical" android:layout_width="fill_parent"
|
04
|
android:layout_height="fill_parent">
|
05
|
<
LinearLayout
android:orientation
=
"horizontal"
|
06
|
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
>
|
07
|
<
Button
android:text
=
"加载ListView"
android:id
=
"@+id/Button01"
|
08
|
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
>
|
10
|
<
Button
android:text
=
"加载另外一个页面<a href="
mailto:%22%20android:id=%22@+id/Button02">" android:id="@+id/Button02</
a
>"
|
11
|
android:layout_width="wrap_content" android:layout_height="wrap_content"></
Button
>
|
13
|
<
LinearLayout
android:id
=
"@+id/LinearLayout01"
android:background
=
"#FFFFFF"
|
14
|
android:layout_width
=
"fill_parent"
android:layout_height
=
"fill_parent"
></
LinearLayout
>
|
从上面的效果图可以看出,那块白色的线性布局是用来动态加载传进来的布局文件。好了,我们就来做如果把布局文件动态的加载进来。下面我们一步一步来实现这个效果,首先,先把需要的 XML 勾画出来,分为步骤如下。
新建一个布局用来存放 ListView 页面,代码如下:
1
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
|
2
|
<
LinearLayout
android:id
=
"@+id/layout"
|
3
|
android:layout_width
=
"fill_parent"
android:layout_height
=
"fill_parent"
|
5
|
<
ListView
android:id
=
"@+id/ListView01"
android:layout_width
=
"wrap_content"
|
6
|
android:layout_height
=
"wrap_content"
></
ListView
>
|
新建一个 ListView 每一行数据的样式,代码如下:
1
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
|
2
|
<
LinearLayout
android:id
=
"@+id/LinearLayout01"
|
3
|
android:layout_width
=
"fill_parent"
android:layout_height
=
"fill_parent"
|
5
|
<
TextView
android:text
=
"@+id/TextView01"
android:id
=
"@+id/TextView01"
|
6
|
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
></
TextView
>
|
新建另外一个页面,用来区分此页面是动态加载的,代码如下:
1
|
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
|
2
|
<
LinearLayout
android:id
=
"@+id/hellolayout"
|
3
|
android:layout_width
=
"fill_parent"
android:layout_height
=
"fill_parent"
|
5
|
<
TextView
android:text
=
"HELLO"
|
6
|
android:layout_width
=
"wrap_content"
android:layout_height
=
"wrap_content"
></
TextView
>
|
实现ListView 的添充数据,这里不详细介绍如何填充ListView 每行数据,有不解的朋友可以回头看我写的文章:点击这里 ,代码如下:
02
|
import
java.util.ArrayList;
|
03
|
import
java.util.HashMap;
|
05
|
import
android.content.Context;
|
06
|
import
android.view.LayoutInflater;
|
07
|
import
android.view.View;
|
08
|
import
android.view.ViewGroup;
|
09
|
import
android.widget.BaseAdapter;
|
10
|
import
android.widget.TextView;
|
12
|
public
class
listAdapter
extends
BaseAdapter {
|
14
|
ArrayList> list =
new
ArrayList>();
|
16
|
private
LayoutInflater inflater;
|
17
|
public
listAdapter(Context contex)
|
19
|
inflater=LayoutInflater.from(contex);
|
20
|
HashMap map=
new
HashMap();
|
21
|
for
(
int
i =
0
; i <
10
; i++) {
|
22
|
map.put(
"name"
,
"例子"
);
|
29
|
public
int
getCount() {
|
35
|
public
Object getItem(
int
position) {
|
37
|
return
list.get(position);
|
41
|
public
long
getItemId(
int
position) {
|
47
|
public
View getView(
int
position, View convertView, ViewGroup parent) {
|
49
|
final
viewHolder myHolder;
|
50
|
if
(convertView==
null
) {
|
51
|
myHolder=
new
viewHolder();
|
52
|
convertView=inflater.inflate(R.layout.list_view_row,
null
);
|
53
|
myHolder.tv=(TextView)convertView.findViewById(R.id.TextView01);
|
54
|
convertView.setTag(myHolder);
|
58
|
myHolder=(viewHolder)convertView.getTag();
|
60
|
myHolder.tv.setText(list.get(position).get(
"name"
).toString());
|
项目大纲如下图:
好了,到此我们的准备工作就己经完成,接下来就是要教大家如何实现动态加载上面所画的布局页面了,先看一下效果图:
点击第一个按钮:
点击第二个按钮:
动态加载代码如下:
03
|
import
android.app.Activity;
|
04
|
import
android.graphics.Color;
|
05
|
import
android.os.Bundle;
|
06
|
import
android.view.LayoutInflater;
|
07
|
import
android.view.View;
|
08
|
import
android.view.View.OnClickListener;
|
09
|
import
android.widget.Button;
|
10
|
import
android.widget.LinearLayout;
|
11
|
import
android.widget.ListView;
|
12
|
import
android.widget.TextView;
|
14
|
public
class
dynaActivity
extends
Activity {
|
15
|
/** Called when the activity is first created. */
|
17
|
public
void
onCreate(Bundle savedInstanceState) {
|
18
|
super
.onCreate(savedInstanceState);
|
19
|
setContentView(R.layout.main);
|
21
|
final
LayoutInflater inflater = LayoutInflater.from(
this
);
|
22
|
Button btn = (Button) findViewById(R.id.Button01);
|
23
|
Button btn2 = (Button) findViewById(R.id.Button02);
|
24
|
final
LinearLayout lin = (LinearLayout) findViewById(R.id.LinearLayout01);
|
25
|
btn.setOnClickListener(
new
OnClickListener() {
|
28
|
public
void
onClick(View v) {
|
29
|
|
</
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
`LayoutInflater`还提供了`cloneInContext()`方法,用于创建一个新的`LayoutInflater`实例,该实例具有与原始实例相同的布局工厂和标签前缀,但其上下文被替换为指定的新上下文,这对于处理多线程或在不同上下文中...
在Android应用开发中,我们通常使用LayoutInflater来动态地加载和插入布局,这在创建自定义视图、处理动态数据或者在运行时创建视图时非常有用。本文将深入解析LayoutInflater的工作原理,并提供实例代码来帮助理解...
在Android应用程序中,我们通常使用XML来定义用户界面的布局,而`LayoutInflater`则起到了桥梁的作用,将静态的XML布局文件转换成可交互的UI组件。 `LayoutInflater`的基本用法包括以下步骤: 1. **获取实例**:...
首先,我们需要理解`LayoutInflater`在Android中的角色。`LayoutInflater`是负责将XML布局文件转换为视图对象(View)的关键类。它从资源文件中读取布局描述,并根据描述创建对应的View实例。通过`LayoutInflater`,...
2. **使用方法**:通过`LayoutInflater.from(Context)`获取LayoutInflater实例,然后调用`inflate()`方法加载布局。 3. **inflate()方法**:接受两个参数,第一个是XML布局资源ID,第二个是父视图,用于确定布局的...
使用`LayoutInflater`有两种常见的方法: 1. **通过Context**: ```java LayoutInflater inflater = LayoutInflater.from(this); View view = inflater.inflate(R.layout.ID, null); ``` 或者简洁地写成一行:...
总之,理解和正确使用LayoutInflater.inflate()的参数是避免Android开发中出现布局问题的关键。在使用时,确保提供适当的父容器,合理设置`attachToRoot`,并且始终关注视图的测量和布局过程。通过这些注意事项,...
在实际开发中,LayoutInflater还有一些高级用法,比如通过`createView()`方法自定义View的创建过程,或者使用LayoutInflater的Factory和Factory2接口来控制View的实例化过程,从而实现更灵活的布局管理。 总的来说...
首先,`LayoutInflater`通常从资源ID获取,可以使用`getSystemService()`方法和`Context.LAYOUT_INFLATER_SERVICE`常量来获取: ```java LayoutInflater inflater = (LayoutInflater) getSystemService(Context....
`LayoutInflater`的核心是`inflate()`方法,它解析XML布局文件,并使用`createView()`创建对应的视图对象。在嵌套的情况下,`inflate()`会递归地处理XML中包含的子视图,包括其他`LayoutInflater`实例。 最后,`...
总的来说,`LayoutInflater` 的`inflate()` 方法是Android应用中动态加载布局的关键,它与`findViewById()` 和`ViewStub` 配合使用,可以灵活地处理各种界面构建需求。了解这些方法的正确使用方式,对于提升Android...
在本文中,我们将深入探讨LayoutInflater的工作原理、使用方法以及如何获取其实例。 首先,LayoutInflater的作用在于将XML布局资源解析并转换为Android视图对象(View或ViewGroup)。与`findViewById()`不同,`...
测试:Android 中LayoutInflater的使用 注意:Aj_04是用了调用另外一个界面,要注意调用的方法, 还一定还要在AndroidManifest.xml 中加上呢句:<activity android:name="LayoutInflaterDemo"></activity>
在这里,我们首先获取`LayoutInflater`的实例,然后使用`inflate()`方法加载`dialog.xml`布局。接着,我们找到布局中的`TextView`和`ImageView`,并设置它们的属性。最后,我们将这个自定义的布局传递给`AlertDialog...
通常,我们会在Activity的`setContentView()` 或 Fragment的`onCreateView()` 方法中使用`LayoutInflater`。`LayoutInflater.inflate()` 方法接收三个参数: 1. `int layoutResID`:这是一个整数,表示要加载的XML...
总之,理解`LayoutInflater`的`inflate`方法及其参数是Android开发中的基础技能。正确使用这些方法能够帮助我们构建更加灵活、高效的用户界面。在处理ListView、RecyclerView等需要复用视图的场景时,尤其需要注意...
"Android开发实现自定义Toast、LayoutInflater使用其他布局示例" Android开发实现自定义Toast、LayoutInflater使用其他布局是 Android 应用程序开发中非常重要的一部分。 Toast 是 Android 应用程序中最常用的提示...