Android LayoutInflater详解

来源:互联网 发布:js 提示允许加载flash 编辑:程序博客网 时间:2024/05/30 20:07

Android开发心得笔记,先看一段代码

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

这个是Activity创建时执行的方法,其中最后一句大家应该都见过,这个加载布局的最简单的方法,但是如果,你需要动态加载布局,那就需要使用其他办法。

那就是LayoutInfaterinflate方法。

一。获得LayoutInflater实例的三种方式

1.LayoutInflater inflater = getLayoutInflater();  //调用ActivitygetLayoutInflater()

2.LayoutInflater localinflater=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

3. LayoutInflater inflater = LayoutInflater.from(context);

二。inflate方法

public View inflate(int Resourece,ViewGroup root)

作用:填充一个新的视图层次结构从指定的XML资源文件中

reSourceViewlayoutID

root生成的层次结构的根视图

return 填充的层次结构的根视图

如果参数root提供了,那么root就是根视图;否则填充的XML文件的根就是根视图。其余几个重载的inflate函数类似。

View类中,也有inflate方法,相关的可以看下这篇文章 http://www.linuxidc.com/Linux/2014-11/108818.htm

结束语:

这段代码和之前说的那最后一句是一个意思:

LayoutInflater inflate = LayoutInflater.from(this);
View view = inflate.inflate(R.layout.main,null);
setContentView(view);

在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(ButtonTextView)

具体作用:

1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;

2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。

LayoutInflater是一个抽象类,在文档中如下声明:

public abstractclass LayoutInflater extends Object

获得 LayoutInflater实例的三种方式

1.LayoutInflater inflater = getLayoutInflater();//调用ActivitygetLayoutInflater() 

2.LayoutInflater inflater = LayoutInflater.from(context);  

3.LayoutInflater inflater =  (LayoutInflater)context.getSystemService

                            (Context.LAYOUT_INFLATER_SERVICE);

其实,这三种方式本质是相同的,从源码中可以看出:

getLayoutInflater()

ActivitygetLayoutInflater()方法是调用 PhoneWindowgetLayoutInflater()方法,看一下该源代码:

publicPhoneWindow(Context context)

{   

 super(context);  

   mLayoutInflater = LayoutInflater.from(context);

}

可以看出它其实是调用LayoutInflater.from(context)

LayoutInflater.from(context)

public staticLayoutInflater from(Context context)

{   

 LayoutInflaterLayoutInflater = (LayoutInflater) context.getSystemService

        (Context.LAYOUT_INFLATER_SERVICE);

    if(LayoutInflater == null)

    {      

    throw new AssertionError("LayoutInflater not found.");  

    }  

   return LayoutInflater;

}

可以看出它其实调用context.getSystemService()

结论:所以这三种方式最终本质是都是调用的Context.getSystemService()

另外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电话服务

inflate方法

通过 sdk api 文档,可以知道该方法有以下几种过载形式,返回值均是 View对象,如下:

public Viewinflate (int resource, ViewGroup root) 

public Viewinflate (XmlPullParser parser, ViewGroup root)

public Viewinflate (XmlPullParser parser, ViewGroup root, boolean attachToRoot)  

public Viewinflate (int resource, ViewGroup root, boolean attachToRoot)

示意代码:

LayoutInflaterinflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);      

View view =inflater.inflate(R.layout.custom, (ViewGroup)findViewById(R.id.test));      

//EditTexteditText = (EditText)findViewById(R.id.content);// error 

EditTexteditText = (EditText)view.findViewById(R.id.content);

对于上面代码,指定了第二个参数 ViewGroup root,当然你也可以设置为 null值。

注意:

·inflate方法与 findViewById方法不同;

·inflater是用来找 res/layout下的 xml 布局文件,并且实例化;

·findViewById()是找具体 xml 布局文件中的具体 widget 控件(:ButtonTextView)

 

1 0
原创粉丝点击