1、LayoutInflater加载布局导致宽高失效
现象:
使用
LayoutInflater
加载布局时,第二个参数root
如果为null
,通过再addView
添加该布局,会导致布局内部设置的宽高失效;如果root
不为空,而且attachToRoot
为true
,则不会失效
原因:
if (root != null) {
//1、如果root不为null,创建布局参数(因为给addView传的参数都是params)
//所以不管attachToRoot是否为空,布局View都被设置了LayoutParams
params = root.generateLayoutParams(attrs);
if (!attachToRoot) {
//标识1
temp.setLayoutParams(params);
}
}
if (root != null && attachToRoot) {
//2、root不为空,attachToRoot为true:调用addView,内部也会调用
//if (!checkLayoutParams(params)) {
// params = generateLayoutParams(params);
//}
//也就是将从外部传进来的params原封不动的设置给View,效果同标识1
root.addView(temp, params);
}
if (root == null || !attachToRoot) {
//如果root为空,则不会对view设置任何布局参数
result = temp;
}
1、root为空
或者
attachToRoot 为 false:不会为View
设置任何的布局参数,此时设置view
宽高是无效的
2、root不为空同时
attachToRoot 为 false:会为View
设置一个来自ViewGroup
的LayoutParams
,属性为wrap_content
,因此此时设置view
宽高是生效的
3、root不为空同时
attachToRoot 为 true:调用addView
,而addView
内部也会为View
设置一个布局参数(来自于设置进addView
的params
,原封不动),因此此时设置view
宽高是生效的
总结:
不论是在
inflate
时设置true
,还是设置false
然后手动addView
,源码都是调用的addView
,但是是实现不同的addView
,root
为null
的话就会导致params
为null
,addView
会根据params
方法决定要不要调用ViewGroup
本身的generateDefaultLayoutParams
,这个方法生成的布局是wrap_content
的,也就能解释为什么root
为空时布局文件的宽高不生效
2、通过Service启动Activity失败
现象
通过
AIDL
从客户端启动服务端的Activity
失败
原因
Service
调用startActivity
调用的是ContextImpl
的startActivity
,而Activity
是自己重写了startActivity方法
,ContextImpl
启动Activity
必须要有Intent.FLAG_ACTIVITY_NEW_TASK
@Override
public void startActivity(Intent intent, Bundle options) {
warnIfCallingFromSystemProcess(