Android提供的系统服务之--LayoutInflater(布局服务)

Android提供的系统服务之--LayoutInflater(布局服务)

——转载请注明出处:coder-pig

本节引言:

本节我们只要是介绍Android系统服务中的——LayoutInflater(布局服务),

相信大家已经习惯了通过Activity.setContentView( )方法来我们的布局文件,

底层的底层还是通过这个系统的LayoutInflater来完成的!

工作原理就是使用Android内置的pull解析器来解析布局~

而在前几天写的blog中用到的动态布局,就是用到这个东东,有兴趣的可以看看

纯Java代码加载布局:http://blog.csdn.net/coder_pig/article/details/43983709

Java代码动态添加组件或布局:http://blog.csdn.net/coder_pig/article/details/43988511

其实基本的用法示例就在上面这两篇blog中,本节就是一些概念的唠叨~

本节正文:

1.LayoutInflater是什么鬼?

答:一个用于加载布局的系统服务!就是实例化与Layout XML文件对应的View对象,不能直接使用,

需要通过getLayoutInflater( )方法或者getSystemService(
)
方法来获得与当前Context绑定的

LayoutInflater实例!

2.LayoutInflater的用法:

①获取LayoutInflater的三种方法:

		//方法一
		LayoutInflater inflater1 = LayoutInflater.from(this);
		//方法二
		LayoutInflater inflater2 = getLayoutInflater();
		//方法三
		LayoutInflater inflater3 = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);

ps:其实前两个方法底层的代码都是调用的第三个东东~

②加载布局的方法:

public View inflate (int resource, ViewGroup root, boolean attachToRoot) 

该方法的三个参数依次为:

①要加载的布局Id

②为该布局的外部再嵌套一层父布局,如果不需要的话,写null就可以了!

③是否为加载的布局文件的最外层套一层root布局,不设置该参数的话,如果

root不为null的话,默认为true,另外,如果root为null的话,attachToRoot就没有作用了!

root不为null,attachToRoot为true的话,会在加载的布局文件最外层嵌套一层root布局;

为false的话,则root失去作用!

简单点理解:是否为加载的布局添加一个root的外层容器~!

③通过LayoutInflater.LayoutParams来设置相关的属性:

比如RelativeLayout还可以通过addRule方法添加规则,就是设置位置,是参考父容器呢,

还是参考子控件,又或者设置margin等等,这个由你决定~

这里写个简单的例子吧:

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.test.MainActivity"
    android:id="@+id/rly">

    <Button
        android:id="@+id/btnOne"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我是setContentView( )加载的Button" />

</RelativeLayout>

MainActivity.java:

package com.example.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.RelativeLayout.LayoutParams;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button btnTwo = new Button(this);
		btnTwo.setText("我是动态加载的Button");
		RelativeLayout rly = (RelativeLayout) findViewById(R.id.rly);
		LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
		RelativeLayout.LayoutParams lp = new LayoutParams(
				RelativeLayout.LayoutParams.MATCH_PARENT,
				RelativeLayout.LayoutParams.WRAP_CONTENT);
		lp.addRule(RelativeLayout.BELOW,R.id.btnOne);
		lp.setMargins(10, 10, 10, 10);
		//addView( )方法可以设置不同参数哦~
		rly.addView(btnTwo, lp);
	}
}

运行效果图:

代码是比较简单的,就不多解释了~,最后提供下LayoutInflater的inflate( )方法的源码,

有兴趣的可以研究下:

public View inflate(XmlPullParser parser, ViewGroup root, boolean attachToRoot) {
    synchronized (mConstructorArgs) {
        final AttributeSet attrs = Xml.asAttributeSet(parser);
        mConstructorArgs[0] = mContext;
        View result = root;
        try {
            int type;
            while ((type = parser.next()) != XmlPullParser.START_TAG &&
                    type != XmlPullParser.END_DOCUMENT) {
            }
            if (type != XmlPullParser.START_TAG) {
                throw new InflateException(parser.getPositionDescription()
                        + ": No start tag found!");
            }
            final String name = parser.getName();
            if (TAG_MERGE.equals(name)) {
                if (root == null || !attachToRoot) {
                    throw new InflateException("merge can be used only with a valid "
                            + "ViewGroup root and attachToRoot=true");
                }
                rInflate(parser, root, attrs);
            } else {
                View temp = createViewFromTag(name, attrs);
                ViewGroup.LayoutParams params = null;
                if (root != null) {
                    params = root.generateLayoutParams(attrs);
                    if (!attachToRoot) {
                        temp.setLayoutParams(params);
                    }
                }
                rInflate(parser, temp, attrs);
                if (root != null && attachToRoot) {
                    root.addView(temp, params);
                }
                if (root == null || !attachToRoot) {
                    result = temp;
                }
            }
        } catch (XmlPullParserException e) {
            InflateException ex = new InflateException(e.getMessage());
            ex.initCause(e);
            throw ex;
        } catch (IOException e) {
            InflateException ex = new InflateException(
                    parser.getPositionDescription()
                    + ": " + e.getMessage());
            ex.initCause(e);
            throw ex;
        }
        return result;
    }
}  

那么,本节就到这里,如果你有什么补充的话欢迎提出~O(∩_∩)O谢谢~

参考资料:

郭大叔的blog:http://blog.csdn.net/guolin_blog/article/details/12921889

时间: 2024-11-03 05:24:34

Android提供的系统服务之--LayoutInflater(布局服务)的相关文章

Android提供的系统服务之--PowerManager(电源服务)

Android提供的系统服务之--PowerManager(电源服务) --转载请注明出处:coder-pig 本节引言: 本节主要讲解的Android为我们提供的系统服务中的:PowerManager电源管理的一个API, 用于管理CPU运行,键盘或者屏幕亮起来;不过,除非是迫不得已吧,不然的话,否则应该尽量避免 使用这个类,并且使用完以后一定要及时释放!本节并不太深入的去讲解,因为这个设计到底层的 一些东西,以后需要用到再深入研究,到时再另外写一篇blog总结!所以本节介绍的主要是 一些基本

Android提供的系统服务之--AlarmManager(闹钟服务)

Android提供的系统服务之--AlarmManager(闹钟服务) --转载请注明出处:coder-pig 本节引言: 本节主要介绍的是Android系统服务中的---AlarmManager(闹钟服务), 除了开发手机闹钟外,更多的时候是作为一个全局的定时器,通常与Service 结合,在特定时间启动其他的组件!本节就来对这个AlarmManager来进行解析 同时通过小闹钟与自动换壁纸来演示这个AlarmManager的用法,好了,开始本节的 内容吧! 本节正文: 1.概念与相关属性方法

Android提供的系统服务之--WindowManager(窗口管理服务)

Android提供的系统服务之--WindowManager(窗口管理服务) --转载请注明出处:coder-pig 本节引言: 本节我们来探讨下这个Android系统服务中的WindowManager(窗口管理服务), 他是显示View的最底层,好像我们的Actviity和Dialog,以及Toast的底层实现都用到 这个WindowManager,他是全局的!核心其实就是WindowManager调用addView, removeView,updateViewLayout这几个方法来显示Vi

Android提供的系统服务之--TelephonyManager(电话管理器)

Android提供的系统服务之--TelephonyManager(电话管理器) 转载请注明出处--coder-pig TelephonyManager的作用: 用于管理手机通话状态,获取电话信息(设备信息.sim卡信息以及网络信息), 侦听电话状态(呼叫状态服务状态.信号强度状态等)以及可以调用电话拨号器拨打电话! 如何获得TelephonyManager的服务对象: TelephonyManager tManager = (TelephonyManager)getSystemService(

Android提供的系统服务之--AudioManager(音频管理器)

Android提供的系统服务之--AudioManager(音频管理器) ----转载请注明出处:coder-pig AudioManager相关简介与常用方法图: 简单的使用例子: 使用Mediaplayer播放音乐,通过AudioManager调节音量大小与静音: 这里,我们需要把要播放的音频文件放到res下的raw文件夹,这个文件夹默认是没有的,需要自己创建哦! 用来放原生资源的,就是打包编译的时候不会把他变成二进制文件!!! 先来看看效果图吧: 就是播放音乐,然后调高音量的时候可以看到滑

Android提供的系统服务之--SmsManager(短信管理器)

Android提供的系统服务之--SmsManager(短信管理器) --转载请注明出处:coder-pig SmsManager相关介绍以及使用图解: 当然为了方便各位,把代码粘一粘吧,就不用麻烦大家写代码了: 有需要的时候就复制粘贴下吧! 1)调用系统发送短信的功能: public void SendSMSTo(String phoneNumber,String message){ //判断输入的phoneNumber是否为合法电话号码 if(PhoneNumberUtils.isGloba

Android提供的系统服务之--Vibrator(振动器)

Android提供的系统服务之--Vibrator(振动器) --转载请注明出处:coder-pig Vibrator简介与相关方法: 简单demo--设置频率不同的振动器 对于Vibrator用的最广泛的莫过于所谓的手机按摩器类的app,在app市场一搜,一堆,笔者随便下了几个下来瞅瞅 ,都是大同小异的,这点小玩意竟然有8W多的下载量...好吧,好像也不算多,不过普遍功能都是切换振动频率来完成 所谓的按摩效果,是否真的有效就不得而知了,那么接下来 我们就来实现一个简单的按摩器吧! 核心其实就是

Android中的系统服务(代理模式)

一,系统启动 Android设备的开机流程总得来分可以分为三部分: 加载引导程序 引导程序bootloader是开机运行的第一个小程序,因此它是针对特定的主板与芯片的.bootloader有很多种,可以使用比较流行的如redboot.uboot.ARMBoot等,也可以开发自己的引导程序,它不是Android操作系统的一部分.引导程序也是OEM厂商或者运营商加锁和限制的地方. 引导程序初始化硬件设备.创建存储器空间的映射等软件运行时所需要的最小环境:加载Linux内核镜像文件(本文只针对Andr

Android之四大组件、六大布局、五大存储

[-] Android六大界面布局方式 1 LinearLayout线性布局 LinearLayout的常用XML属性及相关方法 LinearLayout子元素支持的常用XML属性及方法 2 TableLayout表格布局 TableLayout的常用XML属性及方法 3 FrameLayout帧布局 FrameLayout的常用XM了属性及方法 4 RelativeLayout相对布局 RelativeLayout的XML属性及相关方法说明 RelativeLayoutLayoutParams