android LayoutInflater、setContentView、findviewbyid 区分解析
2016-05-31 15:41
721 查看
一、LayoutInflater.inflate(layoutId, root, boolen)中三个参数的意义及作用
(这点可以参考鸿洋前辈博客地址:/article/1336246.html)
主要知识点其实很少,如下:
若temp为layoutId所代表的布局,inflate的三种方法区分如下:
View view=LayoutInflater.Inflate(layoutId, null )只创建temp ,返回temp
View view=LayoutInflater.Inflate(layoutId, root, false )创建temp,然后执行temp.setLayoutParams(params);返回temp
View view=LayoutInflater.Inflate(layoutId, root, true ) 创建temp,然后执行root.addView(temp, params);最后返回root
关于点三条可能难以理解,此处笔者自己写了一个例子:
activity_main.xml
MainActivity.java
当执行如下两句时,布局如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/820e0b4384b386e1ac43ab28218db29c)
当执行如下一句时,布局如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/c2c20a4ec8c380ee2583b700a03aad6e)
二、又上图可知,两种方式都是可以给activity_main中加入button布局了,但是让人奇怪的是,为什么两者是同一个button,显示的却会有差别呢?第二个问题就自然出来了。
解决办法:我们给button_layout中的button加上一个RelativeLayout,如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/11/c2c20a4ec8c380ee2583b700a03aad6e)
可以发现,这往往就是我们最想要的效果,就是这个button本来多大,就给它。这样我们修改这个button的时候才比较方便。
那么是什么导致在第一个问题中,button无法显示原来的大小的呢?
当我们执行如上代码时,root为null,我们获得的buttonLayout的LayoutParams为null。当我们在viewgroup中使用addView(View child)方法,添加一个没有LayoutParams属性的子view。在viewgroup方法内部,它会调用generateDefaultLayoutParams()生成一个LayoutParams赋值个给子view。
LayoutParams有什么用呢?
简单来说,当一个view的LayoutParams存在时,该布局的宽高设置才会有效。而一个view需要存在LayoutParams,就必须存在父布局。
关于LayoutParams,可以参考这篇博客:http://blog.csdn.net/double2hao/article/details/51438798
三、那么activity_main中的LinearLayout也为空,为什么我们经常使用setContentView(R.id.XXX)的时候却不会造成LayoutParams的缺失而导致布局无法准确显示的问题呢?
如此,我们就需要去了解setContentView()和layoutInflater.inflate()的区别了。
setContentView()设置布局的时候,Android会自动在布局文件的最外层再嵌套一个FrameLayout,所以设置的布局是存在LayoutParams的,也因此可以正常显示。
关于问题二和三,如果还有兴趣的读者,可以参考一下郭霖前辈的博客:
/article/1562127.html
四,findviewbyid()和LayoutInflater.Inflate()有什么区别呢?
findViewById():从setContentView()已经设置的layout中获取到某个控件。
Inflate():把某个layout从xml文件中实例化成一个对象。
(这点可以参考鸿洋前辈博客地址:/article/1336246.html)
主要知识点其实很少,如下:
若temp为layoutId所代表的布局,inflate的三种方法区分如下:
View view=LayoutInflater.Inflate(layoutId, null )只创建temp ,返回temp
View view=LayoutInflater.Inflate(layoutId, root, false )创建temp,然后执行temp.setLayoutParams(params);返回temp
View view=LayoutInflater.Inflate(layoutId, root, true ) 创建temp,然后执行root.addView(temp, params);最后返回root
关于点三条可能难以理解,此处笔者自己写了一个例子:
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/main_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Main Text View"/> </LinearLayout>button_layout.xml
<?xml version="1.0" encoding="utf-8"?> <Button xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" />
MainActivity.java
package com.example.double2.layoutinflatertest; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; public class MainActivity extends AppCompatActivity { private LinearLayout mainLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mainLayout = (LinearLayout) findViewById(R.id.main_layout); LayoutInflater layoutInflater = LayoutInflater.from(this); View buttonLayout = layoutInflater.inflate(R.layout.button_layout, null); mainLayout.addView(buttonLayout); //View buttonLayout = layoutInflater.inflate(R.layout.button_layout, mainLayout,true); } }
当执行如下两句时,布局如下:
View buttonLayout = layoutInflater.inflate(R.layout.button_layout, null); mainLayout.addView(buttonLayout);
当执行如下一句时,布局如下:
View buttonLayout = layoutInflater.inflate(R.layout.button_layout, mainLayout,true);
二、又上图可知,两种方式都是可以给activity_main中加入button布局了,但是让人奇怪的是,为什么两者是同一个button,显示的却会有差别呢?第二个问题就自然出来了。
解决办法:我们给button_layout中的button加上一个RelativeLayout,如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button"/> </RelativeLayout>然后我们可以发现,两种方式都只会有一种效果了,如下:
可以发现,这往往就是我们最想要的效果,就是这个button本来多大,就给它。这样我们修改这个button的时候才比较方便。
那么是什么导致在第一个问题中,button无法显示原来的大小的呢?
View buttonLayout = layoutInflater.inflate(R.layout.button_layout, null); mainLayout.addView(buttonLayout);
当我们执行如上代码时,root为null,我们获得的buttonLayout的LayoutParams为null。当我们在viewgroup中使用addView(View child)方法,添加一个没有LayoutParams属性的子view。在viewgroup方法内部,它会调用generateDefaultLayoutParams()生成一个LayoutParams赋值个给子view。
LayoutParams有什么用呢?
简单来说,当一个view的LayoutParams存在时,该布局的宽高设置才会有效。而一个view需要存在LayoutParams,就必须存在父布局。
关于LayoutParams,可以参考这篇博客:http://blog.csdn.net/double2hao/article/details/51438798
View buttonLayout = layoutInflater.inflate(R.layout.button_layout, mainLayout,true);而当我们执行这行代码的时候,我们最终返回的是root,而root即为activity_main中的LinearLayout。也就和button本身并没有什么关系了。
三、那么activity_main中的LinearLayout也为空,为什么我们经常使用setContentView(R.id.XXX)的时候却不会造成LayoutParams的缺失而导致布局无法准确显示的问题呢?
如此,我们就需要去了解setContentView()和layoutInflater.inflate()的区别了。
setContentView()设置布局的时候,Android会自动在布局文件的最外层再嵌套一个FrameLayout,所以设置的布局是存在LayoutParams的,也因此可以正常显示。
关于问题二和三,如果还有兴趣的读者,可以参考一下郭霖前辈的博客:
/article/1562127.html
四,findviewbyid()和LayoutInflater.Inflate()有什么区别呢?
findViewById():从setContentView()已经设置的layout中获取到某个控件。
Inflate():把某个layout从xml文件中实例化成一个对象。
相关文章推荐
- android 游戏 实战 打飞机 实现主角以及主角相关元素(3)
- Android Invalid maximum heap size: -Xmx 解决方法
- Android_BroadcastReceiver(二)
- Android 热修复之AndFix
- Android开发--CardView使用
- Java4Android第5课:java的继承性
- Android 自定义View学习2
- 环信Android客户端集成文档
- 自定义ScrollView解决onScrollChanged()方法不能调用的问题
- Android Dev Intro - Android NDK with Android Studio
- Android AutoLayout全新的适配方式 堪称适配终结者(2)
- Android 城市列表ListView 之 按首字母分组
- Android服务一 创建启动服务
- Android代码中设置字体大小
- Android Studio 自定义快捷键
- android实现一天24小时刻度尺
- 我爱android studio
- Android是如何管理应用的进程与内存分配
- Android 自定义View (三) 圆环交替 等待效果
- Android混淆规则