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

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行代码出现空指针错误,导致程序崩溃


3.activity添加ScrollView后或外部容器为RelativeLayout时onFling不起作用,无法滑动问题


1.参考资料: activity添加ScrollView后或外部容器为RelativeLayout时onFling不起作用,无法滑动问题
Android 滑动切换页面 以及屏幕手势

目的:

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);  
   }  








 
  

你可能感兴趣的:(Android,Java)