AppBarLayout 有毒,我有一粒解药,要不?(修改))

以前将这篇稿子发到专题 《Android 开发经验谈》 和 《Android 开发知识》的时候,过了很久,《Android开发知识》审核没通过,《Android开发经验谈》被我自己撤回了。开始没明白原因,重新重新读了下文章,果然有问题,所以重新修改下。

上一次的错误

第一次发稿的时候,错误的将问题指向了view的高度,重新测试发现,当控件为隐藏的时候,高度为0,问题在margin高度

Paste_Image.png

问题:tabLayout会距离上面负几个dp

111.gif
怀疑:fitSystemWindow 设置的问题

求证:将顶部的元素节点的fitSystemWindow设置为true和false都没有效果,并且距离顶部负的地方在tabLayout显示动态一栏的前面,(开始没想到这点)

定位问题:元素是否滚动是由appBarLayout控制

求证:查看appBarLayout 代码,很容易就发现一段计算滚动范围的代码

/** * Returns the scroll range of all children. 
* * @return the scroll range in px */
public final int getTotalScrollRange() {  
  if (mTotalScrollRange != INVALID_SCROLL_RANGE) {   
     return mTotalScrollRange;  
  }   
 int range = 0;   
 for (int i = 0, z = getChildCount(); i < z; i++) {   
     final View child = getChildAt(i);   
     final LayoutParams lp = (LayoutParams) child.getLayoutParams(); 
     final int childHeight = child.getMeasuredHeight();    
     final int flags = lp.mScrollFlags;   
     if ((flags & LayoutParams.SCROLL_FLAG_SCROLL) != 0) {       
     // We're set to scroll so add the child's height    
        range += childHeight + lp.topMargin + lp.bottomMargin;   
         if ((flags & LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED) != 0) {        
        // For a collapsing scroll, we to take the collapsed height into account.      
          // We also break straight away since later views can't scroll beneath       
         // us        
        range -= ViewCompat.getMinimumHeight(child);      
          break;        
      }    
    } else {      
      // As soon as a view doesn't have the scroll flag, we end the range calculation.      
      // This is because views below can not scroll under a fixed view.            break;   
     }   
 }    
  return mTotalScrollRange = Math.max(0, range - getTopInset());
}

简单的翻译下:判断当前滚动范围是否=-1,如果是开始往下执行,遍历子元素,获取子元素的高度,判断该元素是否可以滚动,如果可以滚动加上该元素的高度和距离顶部以及底部的高度,如果子元素设置了exitUntilCollapsed,则减去该元素的最小高度。如果没有设置Scroll 则什么都不做

寻找解决方案

我的tab 栏上面的一个元素的确设置了滚动,还设置了距离顶部和底部的Margin,用模拟器debug 到这行发现代码没有判断是否隐藏,并且将margin值加到了range 中,
<code>
childHeight = 0;
lp.topMargin = 39
lp.bottomMargin = 42
</code>
问题就是应该就是margin惹得祸,将margin去掉后,果然好了,另外一种方法,在view上再嵌套一个父元素,在计算高度的时候,没计算子孙元素的margin

代码

为了让大家直观的看到这个错误,这里将问题代码简化后贴出

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:paddingBottom="16dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    tools:context="wdwd.com.behave.MainActivity">
    <!--toolbar--> 
   <android.support.design.widget.AppBarLayout 
       android:layout_width="match_parent"
        android:layout_height="wrap_content"> 
       <android.support.v7.widget.Toolbar
            android:layout_width="match_parent" 
           android:layout_height="wrap_content"
            app:layout_scrollFlags="scroll|enterAlways" 
           android:id="@+id/toolbar" /> 
       <TextView   
         android:id="@+id/tv_problem_view"
            android:layout_width="match_parent"
            android:background="@android:color/black" 
           app:layout_scrollFlags="scroll" 
           android:layout_marginBottom="10dip"
            android:layout_marginTop="40dip" 
           android:layout_height="wrap_content"  
          android:text="我是好人"   
         android:visibility="visible">  
      </TextView>    
    <TextView     
       android:layout_width="match_parent"  
          android:layout_height="41dip"
            android:text="alsdjfalksdfj"/>
    </android.support.design.widget.AppBarLayout>
 </android.support.design.widget.CoordinatorLayout>

大家可以试试将tv_problem_view设置为隐藏看看,本来底部停靠的文本还能往上滚动。

其他一些坑

CoordinaLayout的坑还么完,如果直接加Pulltorefresh 的话会出现拉一半就刷新的问题,这个问题网上能搜到解决方案,监听appbarLayoutOffsetChange事件。

coordinatorLayout 的子scrollview必须实现NestedChild,实际使用中发现在部分手机上有问题,结果全换成了recyclerview,webview网上找了段代码,虽然能嵌套滑动,但是没惯性,时间有限没深入研究,希望有知道的同学分享,大家一起进步。

这里捎带提下md的tablayout,因为这期也用到了,md的tablayout很强大,强大在哪里,支持固定宽度,通俗讲显示一屏,加权重,也支持scrollable,超出屏幕滑动,但是用过的肯定知道tablayout不定自定义下面指示器的 红色部分的宽度,我用的是简书里的hackware 大神写的magiclayout。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容