[关闭]
@wangwangheng 2014-12-26T12:44:53.000000Z 字数 12975 阅读 1716

在此处输入标题

未分类


在此输入正文

  1. public boolean isInScreen(){
  2. Rect out = new Rect();
  3. Rect focus = new Rect();
  4. Rect draw = new Rect();
  5. Rect local = new Rect();
  6. Rect global = new Rect();
  7. mViewPager.getHitRect(out);
  8. mViewPager.getFocusedRect(focus);
  9. mViewPager.getDrawingRect(draw);
  10. mViewPager.getLocalVisibleRect(local);
  11. mViewPager.getGlobalVisibleRect(global);
  12. DebugLog.i("wangheng", mAttachedPresenter + "==========oo0ut::" + out + "\nfocus::" + focus + "\ndraw::" + draw
  13. + "\nlocal::" + local + "\nglobal::" + global);
  14. return global.top > 0;
  15. }

至于ViewPager嵌套引起子ViewPager无法触摸问题是通过在子ViewPager的onTouchEvent中添加
Java

1
getParent().requestDisallowInterceptTouchEvent(true);
禁止父控件对touch event做intercept解决的。

ViewPager滑动速度的设置是通过反射的方式重新设置ViewPager的Scroller,改变Scroller的startScroll的间隔时间完成的。调用setScrollDurationFactor(double)即可。
http://www.trinea.cn/android/auto-scroll-view-pager/

  1. Fragment真正意义上的onResume和onPause方法:setUserVisibleHint() --- 但是在嵌套的Fragment中当依附的Fragment被hide或者show的时候,并不会调用这个方法

// Android得到状态栏高度

  1. /**
  2. * Android得到状态栏高度
  3. * @param activity
  4. * @return > 0 success; <= 0 fail
  5. */
  6. public static int getStatusHeight(Activity activity){
  7. int statusHeight = 0;
  8. Rect localRect = new Rect();
  9. activity.getWindow().getDecorView(
  10.         ).getWindowVisibleDisplayFrame(localRect);
  11. statusHeight = localRect.top;
  12. if (0 == statusHeight){
  13. Class<?> localClass;
  14. try {
  15. localClass = Class.forName(
  16.             "com.android.internal.R$dimen");
  17. Object localObject = localClass.newInstance();
  18. int i5 = Integer.parseInt(
  19.               localClass.getField("status_bar_height").get(
  20.                 localObject).toString());
  21. statusHeight = activity.getResources(
  22.             ).getDimensionPixelSize(i5);
  23. } catch (ClassNotFoundException e) {
  24. e.printStackTrace();
  25. } catch (IllegalAccessException e) {
  26. e.printStackTrace();
  27. } catch (InstantiationException e) {
  28. e.printStackTrace();
  29. } catch (NumberFormatException e) {
  30. e.printStackTrace();
  31. } catch (IllegalArgumentException e) {
  32. e.printStackTrace();
  33. } catch (SecurityException e) {
  34. e.printStackTrace();
  35. } catch (NoSuchFieldException e) {
  36. e.printStackTrace();
  37. }
  38. }
  39. return statusHeight;
  40. }

getViewTreeObserver

由于这两天在做listView的东西,所以整理出来一些我个人认为比较特别的属性,通过设置这样的属性可以做出更加美观的列表

首先是stackFromBottom属性,这只该属性之后你做好的列表就会显示你列表的最下面,值为true和false

android:stackFromBottom="true"

第二是transciptMode属性,需要用ListView或者其它显示大量Items的控件实时跟踪或者查看信息,并且希望最新的条目可以自动滚动到可视范围内。通过设置的控件transcriptMode属性可以将Android平台的控件(支持ScrollBar)自动滑动到最底部。
android:transcriptMode="alwaysScroll"

第三cacheColorHint属性,很多人希望能够改变一下它的背景,使他能够符合整体的UI设计,改变背景背很简单只需要准备一张图片然后指定属性 android:background="@drawable/bg",不过不要高兴地太早,当你这么做以后,发现背景是变了,但是当你拖动,或者点击list空白位置的时候发现ListItem都变成黑色的了,破坏了整体效果。

如果你只是换背景的颜色的话,可以直接指定android:cacheColorHint为你所要的颜色,如果你是用图片做背景的话,那也只要将android:cacheColorHint指定为透明(#00000000)就可以了

第四divider属性,该属性作用是每一项之间需要设置一个图片做为间隔,或是去掉item之间的分割线

android:divider="@drawable/list_driver" 其中 @drawable/list_driver 是一个图片资源,如果不想显示分割线则只要设置为android:divider="@drawable/@null" 就可以了

第五fadingEdge属性,上边和下边有黑色的阴影

android:fadingEdge="none" 设置后没有阴影了~

第六scrollbars属性,作用是隐藏listView的滚动条,

android:scrollbars="none"与setVerticalScrollBarEnabled(true);的效果是一样的,不活动的时候隐藏,活动的时候也隐藏

第七fadeScrollbars属性,android:fadeScrollbars="true" 配置ListView布局的时候,设置这个属性为true就可以实现滚动条的自动隐藏和显示。

第八fastScrollEnabled属性 ,

很多开发者不知道ListView列表控件的快速滚动滑块是如何启用的,这里Android开发网告诉大家,辅助滚动滑块只需要一行代码就可以搞定,如果你使用XML布局只需要在ListView节点中加入 android:fastScrollEnabled="true" 这个属性即可,而对于Java代码可以通过myListView.setFastScrollEnabled(true); 来控制启用,参数false为隐藏。 还有一点就是当你的滚动内容较小,不到当前ListView的3个屏幕高度时则不会出现这个快速滚动滑块,同时该方法仍然是AbsListView的基础方法,可以在ListView或GridView等子类中使用快速滚动辅助。

第九drawSelectorOnTop属性
When set to true, the selector will be drawn over the selecteditem. Otherwise the selector is drawn behind the selected item. Thedefault value is false.

android:drawSelectorOnTop="true" 点击某一条记录,颜色会显示在最上面,记录上的文字被遮住,所以点击文字不放,文字就看不到

android:drawSelectorOnTop="false"点击某条记录不放,颜色会在记录的后面,成为背景色,但是记录内容的文字是可见的


Android开发中StackOverflowError错误实例分析
一、概述
我在一个复杂的layout嵌套较多的android界面,碰到了java.lang.StackOverflowError这个Fatal Exception,app程序crash退出。这个错误出现的比较奇怪,在我做技术调研的时候,这个界面是放在单独的一个程序中展示的,工作很正常,没有出现这个严重错误,当将其嵌入到一个ActivityGroup后才报错。

   android SDK中对该错误的出现的场景描述为:由于栈调用的层次太多,超过了虚拟器dalvik的最大限制(作为一个虚拟器参数,可定制)导致的。当程序编写错误导致无限递归调用时会触发,此外程序正确但是递归调用的层次过深也会触发。

   结合我的界面的情况,在单独程序中运行时没有问题,则说明不存在死循环的无限递归错误。观察该界面的集成情况,发现为了Tab页实现,该界面在显示时,被两个ActivityGroup嵌套,增加了6层显式父layout。而因为该界面复杂,设计时,list_header view的layout深度为5层,而list_item的深度则为6层。原因定位为界面嵌套层次过深。

二、解决方法
解决嵌套过深的基本思路是在实现同样的效果的前提下减少界面的layout深度。在我将list_header view layout深度由5层精简为3层,list_item 深度由6层减少为4层后,该错误被解决。具体的方法有:
1) 多用RelativeLayout的各种布局属性来完成布局,而避免过多使用嵌套layout来实现。
2) 占位或填充剩余空间的元素多用View,避免使用layout等viewGroup。

总结下,从实际的数据来看,设计中layout嵌套深度超过10层,就应该考虑下优化了,否则就会出现java.lang.StackOverflowError的crash了。

三、错误详细日志
E/AndroidRuntime( 5196): FATAL EXCEPTION: main
E/AndroidRuntime( 5196): java.lang.StackOverflowError
E/AndroidRuntime( 5196): at android.graphics.Paint.measureText(Paint.java:1057)
E/AndroidRuntime( 5196): at android.text.Styled.drawDirectionalRun(Styled.java:267)
E/AndroidRuntime( 5196): at android.text.Styled.measureText(Styled.java:430)
E/AndroidRuntime( 5196): at android.text.Layout.measureText(Layout.java:1655)
E/AndroidRuntime( 5196): at android.text.Layout.getLineMax(Layout.java:689)
E/AndroidRuntime( 5196): at android.text.Layout.draw(Layout.java:340)
E/AndroidRuntime( 5196): at android.widget.TextView.onDraw(TextView.java:4050)
E/AndroidRuntime( 5196): at android.view.View.draw(View.java:6740)
E/AndroidRuntime( 5196): at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
E/AndroidRuntime( 5196): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
E/AndroidRuntime( 5196): at android.view.View.draw(View.java:6743)
E/AndroidRuntime( 5196): at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
E/AndroidRuntime( 5196): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
E/AndroidRuntime( 5196): at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
E/AndroidRuntime( 5196): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
E/AndroidRuntime( 5196): at android.view.View.draw(View.java:6743)
E/AndroidRuntime( 5196): at android.view.View.buildDrawingCache(View.java:6502)
E/AndroidRuntime( 5196): at android.view.View.getDrawingCache(View.java:6288)
E/AndroidRuntime( 5196): at android.view.ViewGroup.drawChild(ViewGroup.java:1565)
E/AndroidRuntime( 5196): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
E/AndroidRuntime( 5196): at android.widget.AbsListView.dispatchDraw(AbsListView.java:1365)
E/AndroidRuntime( 5196): at android.widget.ListView.dispatchDraw(ListView.java:3046)
E/AndroidRuntime( 5196): at android.view.View.draw(View.java:6846)
E/AndroidRuntime( 5196): at android.widget.AbsListView.draw(AbsListView.java:2257)
E/AndroidRuntime( 5196): at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
E/AndroidRuntime( 5196): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
E/AndroidRuntime( 5196): at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
E/AndroidRuntime( 5196): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
E/AndroidRuntime( 5196): at android.view.ViewGroup.drawChild(ViewGroup.java:1638)
E/AndroidRuntime( 5196): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
E/AndroidRuntime( 5196): at android.view.View.draw(View.java:6743)
E/AndroidRuntime( 5196): at android.widget.FrameLayout.draw(FrameLayout.java:352)
E/AndroidRuntime( 5196): at android.view.ViewGroup.drawChild(ViewGroup.java:1640)
E/AndroidRuntime( 5196): at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)
E/AndroidRuntime( 5196): at android.view.View.draw(View.java:6743)
E/AndroidRuntime( 5196): at android.widget.FrameLayout.draw(FrameLayout.java:352)
E/AndroidRuntime( 5196): at com.android.internal.policy.impl.PhoneWindowDecorView.draw(PhoneWindow.java:1842)E/AndroidRuntime(5196):atandroid.view.ViewGroup.drawChild(ViewGroup.java:1640)E/AndroidRuntime(5196):atandroid.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)E/AndroidRuntime(5196):atandroid.view.View.draw(View.java:6743)E/AndroidRuntime(5196):atandroid.widget.FrameLayout.draw(FrameLayout.java:352)E/AndroidRuntime(5196):atandroid.view.ViewGroup.drawChild(ViewGroup.java:1640)E/AndroidRuntime(5196):atandroid.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)E/AndroidRuntime(5196):atandroid.view.View.draw(View.java:6743)E/AndroidRuntime(5196):atandroid.view.ViewGroup.drawChild(ViewGroup.java:1640)E/AndroidRuntime(5196):atandroid.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)E/AndroidRuntime(5196):atandroid.view.ViewGroup.drawChild(ViewGroup.java:1638)E/AndroidRuntime(5196):atandroid.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)E/AndroidRuntime(5196):atandroid.view.View.draw(View.java:6743)E/AndroidRuntime(5196):atandroid.widget.FrameLayout.draw(FrameLayout.java:352)E/AndroidRuntime(5196):atandroid.view.ViewGroup.drawChild(ViewGroup.java:1640)E/AndroidRuntime(5196):atandroid.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)E/AndroidRuntime(5196):atandroid.view.ViewGroup.drawChild(ViewGroup.java:1638)E/AndroidRuntime(5196):atandroid.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)E/AndroidRuntime(5196):atandroid.view.View.draw(View.java:6743)E/AndroidRuntime(5196):atandroid.widget.FrameLayout.draw(FrameLayout.java:352)E/AndroidRuntime(5196):atandroid.view.ViewGroup.drawChild(ViewGroup.java:1640)E/AndroidRuntime(5196):atandroid.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)E/AndroidRuntime(5196):atandroid.view.ViewGroup.drawChild(ViewGroup.java:1638)E/AndroidRuntime(5196):atandroid.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)E/AndroidRuntime(5196):atandroid.view.View.draw(View.java:6743)E/AndroidRuntime(5196):atandroid.view.ViewGroup.drawChild(ViewGroup.java:1640)E/AndroidRuntime(5196):atandroid.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)E/AndroidRuntime(5196):atandroid.view.View.draw(View.java:6743)E/AndroidRuntime(5196):atandroid.widget.FrameLayout.draw(FrameLayout.java:352)E/AndroidRuntime(5196):atandroid.view.ViewGroup.drawChild(ViewGroup.java:1640)E/AndroidRuntime(5196):atandroid.view.ViewGroup.dispatchDraw(ViewGroup.java:1367)E/AndroidRuntime(5196):atandroid.view.View.draw(View.java:6743)E/AndroidRuntime(5196):atandroid.widget.FrameLayout.draw(FrameLayout.java:352)E/AndroidRuntime(5196):atcom.android.internal.policy.impl.PhoneWindowDecorView.draw(PhoneWindow.java:1842)
E/AndroidRuntime( 5196): at android.view.ViewRoot.draw(ViewRoot.java:1407)
E/AndroidRuntime( 5196): at
W/ActivityManager( 71): Force finishing activity com.baidu.test/.CloudDemActivity
W/WindowManager( 71): No window to dispatch pointer action 1

!(d)(http://images.cnitblog.com/blog/405193/201304/21152316-f1f69a9ea49a4ce4aa42257371631a2e.png)

https://github.com/ksoichiro/Android-ObservableScrollView

当发生这种状况 ,eclipse得到的异常就在你listView.setAdapter(adapter);这句话中,你怎么看listView和adapter都没有空值,正纳闷时,你应该要考虑一下被你添加的FooterView或者HeaderView是否为null,因为空的话。。。ListView就无法测量高度。。。然后无法布局。。最后就报错了。。。还有addFooterView和addHeaderView这两个方法一定要放在listView.setAdapter(adapter)前面,要不然死活都不会出现你想要的FooterView或者HeaderView

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注