android 使用RelativeLayout布局出现的问题汇总(不定期添加更新)

本文汇总了在Android开发中使用RelativeLayout布局时遇到的问题,包括初始化时无法获取宽高及PopupWindow中getWidth、getHeight返回0或-2的解决办法。针对这些问题,提供了具体的产生原因分析及对应的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.初始化时获得布局的宽高:

(1).参考资料:Android初始化的时候获取加载的布局的宽高

目的:

在初始化或者说OnCreate方法中获取加载的布局的宽高,最后说到,调用view.measure(0, 0);然后在调用getMeasuredWidth和getMeasuredHeight就可以获得测量的宽高.

产生原因:

1.如果使用Inflater的情况下会出现以上错误,原因是用Inflater渲染组件的时候并没有给其指定父控件,所以渲染器不会去解析width 和 height属性,就会导致空指针异常。

2.由于调用headView.measure(0, 0);的时候是通过inflate(R.layout.headview, null);方式加载的布局,因此设置的外层RelativeLayout布局的LayoutParams是null的,恰巧相对布局没有检查是否为null就直接调用了mLayoutParams.width或者mLayoutParams.height,因此就报空指针错误了。

解决办法:

1.view.setLayoutParams(newLayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));指定宽度和高度,然后调用measure方法就OK。

2.加载布局的时候通过inflater.inflate(R.layout.viewgroup_relativelayout,(ViewGroup) findViewById(R.id.mainLayout),false);方式加载。这样的话会设置他的布局参数。

3 手动设置布局参数添加上



lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
setLayoutParams(lp);


2.PopupWindow中getWidth、getHeight为0或者-2


1.参考资料:PopupWindow中getWidth、getHeight为0或者-2

产生原因:

出现这个的原因就是因为PopupWindow的尺寸拿不到,因为内容的View的width和height都是wrap_content,所以在PopupWindow里面的contentView还没被绘制出来的时候,这两个值都还是0。

如果直接调用PopupWindow的getWidth()和getHeight(),会发现拿到的都是ViewGroup.LayoutParams.WRAP_CONTENT的值 -2;

解决方法:

解决的方法就是在初始化contentView的时候,强制绘制contentView,并且马上初始化contentView的尺寸。这里只需要一句代码:

contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);

popwin_layout.xml的根Layout必须为LinearLayout;如果为RelativeLayout的话,会在第38行代码出现空指针错误,导致程序崩溃





目的:

1.关于activity添加ScrollView后或是外部为RelativeLayout时onFling不起作用,无法滑动问题
2. 如果需要设置activity切换效果,在startActivity(intent);之后添加 overridePendingTransition(android.R.anim.slide_in_left,android.R.anim.slide_out_right);即可,可修改相应参数.
3.但当在activity中添加ScrollView实现滚动activity的效果后或外部容器为RelativeLayout时,activity的滑动效果却无法生效了,原因是因为activity没有处理滑动效果,

解决方法:

实现dispatchTouchEvent函数,在其实现中调用mGestureDetector.onTouchEvent(ev),类似OnTouch。代码如下:
@Override  
   public boolean dispatchTouchEvent(MotionEvent ev) {  
       mGestureDetector.onTouchEvent(ev);  
       // scroll.onTouchEvent(ev);  
       return super.dispatchTouchEvent(ev);  
   }  








 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值