CoordinatorLayout配合AppBarLayout,Toolbar和TabLayout的使用

关于Toolbar和TabLayout的使用,如果不了解的话,可以先看看者两篇文章:
ToolBar的使用
TabLayout的使用

今天要实现的效果如下图所示:
这里写图片描述
当ToolBar滚出屏幕的时候,TabLayout固定在屏幕顶部,然后下滑的时候在划出Toolbar.

先来介绍下AppBarLayout控件,它是继承LinerLayout实现的一个ViewGroup容器组件,是为了Material Design而设计的App Bar,支持手势滑动操作。

默认的AppBarLayout是垂直方向的,它的作用是把AppBarLayout包裹的内容都作为AppBar。
使用方式非常简单,直接在布局文件中包裹想要作为顶部栏的控件,例如Toolbar和TabLayout.

当然在使用之前,别忘了在gradle中引入Material Design支持包

<code class="language-gradle hljs bash has-numbering">compile <span class="hljs-string">'com.android.support:design:23.3.0'</span></code><ul style="" class="pre-numbering"><li>1</li></ul>

下面是这次demo的完整布局文件,/res/layout/activity_main.xml:

<code class="language-xml hljs  has-numbering"><span class="hljs-pi"><?xml version="1.0" encoding="utf-8"?></span>
<span class="hljs-tag"><<span class="hljs-title">android.support.design.widget.CoordinatorLayout</span> <span class="hljs-attribute">xmlns:android</span>=<span class="hljs-value">"http://schemas.android.com/apk/res/android"</span>
    <span class="hljs-attribute">xmlns:app</span>=<span class="hljs-value">"http://schemas.android.com/apk/res-auto"</span>
    <span class="hljs-attribute">xmlns:tools</span>=<span class="hljs-value">"http://schemas.android.com/tools"</span>
    <span class="hljs-attribute">android:id</span>=<span class="hljs-value">"@+id/main_content"</span>
    <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"match_parent"</span>
    <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"match_parent"</span>
    <span class="hljs-attribute">tools:context</span>=<span class="hljs-value">"blog.csdn.net.mchenys.appbarlayoutdemo.MainActivity"</span>></span>


    <span class="hljs-tag"><<span class="hljs-title">android.support.design.widget.AppBarLayout
</span>        <span class="hljs-attribute">android:id</span>=<span class="hljs-value">"@+id/appbar"</span>
        <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"match_parent"</span>
        <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"wrap_content"</span>></span>
        <span class="hljs-comment"><!--标题栏
        设置的layout_scrollFlags有如下几种选项:
        scroll: 所有想滚动出屏幕的view都需要设置这个flag-没有设置这个flag的view将被固定在屏幕顶部。
        enterAlways: 这个flag让任意向下的滚动都会导致该view变为可见,启用快速“返回模式”。
        enterAlwaysCollapsed: 当你的视图已经设置minHeight属性又使用此标志时,
                              你的视图只能以最小高度进入,只有当滚动视图到达顶部时才扩大到完整高度。
        exitUntilCollapsed: 滚动退出屏幕,最后折叠在顶端。--></span>
        <span class="hljs-tag"><<span class="hljs-title">android.support.v7.widget.Toolbar
</span>            <span class="hljs-attribute">android:id</span>=<span class="hljs-value">"@+id/toolbar"</span>
            <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"match_parent"</span>
            <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"?attr/actionBarSize"</span>
            <span class="hljs-attribute">android:background</span>=<span class="hljs-value">"?attr/colorPrimary"</span>
            <span class="hljs-attribute">app:layout_scrollFlags</span>=<span class="hljs-value">"scroll|enterAlways"</span>></span>

            <span class="hljs-tag"><<span class="hljs-title">TextView
</span>                <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"wrap_content"</span>
                <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"match_parent"</span>
                <span class="hljs-attribute">android:layout_gravity</span>=<span class="hljs-value">"center"</span>
                <span class="hljs-attribute">android:gravity</span>=<span class="hljs-value">"center"</span>
                <span class="hljs-attribute">android:text</span>=<span class="hljs-value">"自定义标题"</span> /></span>
        <span class="hljs-tag"></<span class="hljs-title">android.support.v7.widget.Toolbar</span>></span>

        <span class="hljs-comment"><!--选项卡--></span>
        <span class="hljs-tag"><<span class="hljs-title">android.support.design.widget.TabLayout
</span>            <span class="hljs-attribute">android:id</span>=<span class="hljs-value">"@+id/tabLayout"</span>
            <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"match_parent"</span>
            <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"wrap_content"</span>
            <span class="hljs-attribute">android:background</span>=<span class="hljs-value">"#80ffffff"</span>
            <span class="hljs-attribute">app:tabIndicatorColor</span>=<span class="hljs-value">"@color/colorAccent"</span>
            <span class="hljs-attribute">app:tabMode</span>=<span class="hljs-value">"scrollable"</span>
            <span class="hljs-attribute">app:tabSelectedTextColor</span>=<span class="hljs-value">"@color/colorAccent"</span>
            <span class="hljs-attribute">app:tabTextColor</span>=<span class="hljs-value">"@android:color/black"</span> /></span>
    <span class="hljs-tag"></<span class="hljs-title">android.support.design.widget.AppBarLayout</span>></span>

    <span class="hljs-comment"><!--包含可滑动的布局内容(RecyclerView,NestedScrollView,不支持ListView,ScrollView)
    必须要设置app:layout_behavior="@string/appbar_scrolling_view_behavior"
    属性来告知CoordinatorLayout该组件是带有滑动行为的组件,
    然后CoordinatorLayout在接受到滑动时会通知AppBarLayout中可滑动的Toolbar可以滑出屏幕--></span>
    <span class="hljs-tag"><<span class="hljs-title">android.support.v7.widget.RecyclerView
</span>        <span class="hljs-attribute">android:id</span>=<span class="hljs-value">"@+id/recyclerView"</span>
        <span class="hljs-attribute">android:layout_width</span>=<span class="hljs-value">"match_parent"</span>
        <span class="hljs-attribute">android:layout_height</span>=<span class="hljs-value">"wrap_content"</span>
        <span class="hljs-attribute">app:layout_behavior</span>=<span class="hljs-value">"@string/appbar_scrolling_view_behavior"</span> /></span>
<span class="hljs-tag"></<span class="hljs-title">android.support.design.widget.CoordinatorLayout</span>></span>

</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li></ul>

现在来介绍下CoordinatorLayout,CoordinatorLayout是一个增强型的FrameLayout,它的作用就是用来协调其所包裹的子view的手势操作的.
为了达到上面效果图的手势动画效果,我们必须做如下设置,通过app:layout_scrollFlags=”scroll|enterAlways” 属性来确定哪个组件是可滑动的.
关于layout_scrollFlags的属性设置,在上面的布局文件中已经描述清楚,这里就不多说了.

同时 ,为了使得Toolbar可以滑动,我们必须还得有个条件,就是CoordinatorLayout布局下包裹一个可以滑动的布局,比如: RecyclerView,NestedScrollView(ListView,ScrollView不支持)具有滑动效果的组件。
并且还需要给这些组件设置如下属性来告诉CoordinatorLayout,该组件是带有滑动行为的组件,然后CoordinatorLayout在接受到滑动时会通知AppBarLayout 中可滑动的Toolbar可以滑出屏幕了。

<code class="language-xml hljs  has-numbering"> app:layout_behavior="@string/appbar_scrolling_view_behavior"</code><ul style="" class="pre-numbering"><li>1</li></ul>

这里还得提醒一下,由于我们使用了ToolBar来替换系统默认的ActionBar,所以必须要在
/res/values/style.xml中配置隐藏ActionBar和title.

<code class="language-xml hljs  has-numbering"><span class="hljs-tag"><<span class="hljs-title">resources</span>></span>

    <span class="hljs-comment"><!-- Base application theme. --></span>
    <span class="hljs-tag"><<span class="hljs-title">style</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"AppTheme"</span> <span class="hljs-attribute">parent</span>=<span class="hljs-value">"AppTheme.Base"</span>></span><span class="css"></span><span class="hljs-tag"></<span class="hljs-title">style</span>></span>

    <span class="hljs-tag"><<span class="hljs-title">style</span> <span class="hljs-attribute">name</span>=<span class="hljs-value">"AppTheme.Base"</span>  <span class="hljs-attribute">parent</span>=<span class="hljs-value">"Theme.AppCompat"</span>></span><span class="css">
        <!<span class="hljs-tag">--</span>隐藏<span class="hljs-tag">ActionBar</span>和标题<span class="hljs-tag">--</span>>
        <<span class="hljs-tag">item</span> <span class="hljs-tag">name</span>="<span class="hljs-tag">windowActionBar</span>"><span class="hljs-tag">false</span></<span class="hljs-tag">item</span>>
        <<span class="hljs-tag">item</span> <span class="hljs-tag">name</span>="<span class="hljs-tag">windowNoTitle</span>"><span class="hljs-tag">true</span></<span class="hljs-tag">item</span>>
        <!<span class="hljs-tag">--ToolBar</span>的颜色<span class="hljs-tag">--</span>>
        <<span class="hljs-tag">item</span> <span class="hljs-tag">name</span>="<span class="hljs-tag">colorPrimary</span>"><span class="hljs-at_rule">@<span class="hljs-keyword">color/colorPrimary</item></span>
        <!--状态栏的颜色-->
        <item name=<span class="hljs-string">"colorPrimaryDark"</span>>@color/colorPrimaryDark</item>
        <!--EditText,RadioButton,CheckBox的点击效果颜色-->
        <item name=<span class="hljs-string">"colorAccent"</span>>@color/colorAccent</item>
    </span></span><span class="hljs-tag"></<span class="hljs-title">style</span>></span>

<span class="hljs-tag"></<span class="hljs-title">resources</span>></span>
</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li></ul>

好了,最后贴上MainActivity的代码:

<code class="language-java hljs  has-numbering"><span class="hljs-keyword">package</span> blog.csdn.net.mchenys.appbarlayoutdemo;

<span class="hljs-keyword">import</span> android.os.Bundle;
<span class="hljs-keyword">import</span> android.support.design.widget.TabLayout;
<span class="hljs-keyword">import</span> android.support.v7.app.AppCompatActivity;
<span class="hljs-keyword">import</span> android.support.v7.widget.DefaultItemAnimator;
<span class="hljs-keyword">import</span> android.support.v7.widget.LinearLayoutManager;
<span class="hljs-keyword">import</span> android.support.v7.widget.RecyclerView;
<span class="hljs-keyword">import</span> android.support.v7.widget.Toolbar;
<span class="hljs-keyword">import</span> android.view.View;
<span class="hljs-keyword">import</span> android.view.ViewGroup;
<span class="hljs-keyword">import</span> android.widget.TextView;

<span class="hljs-keyword">import</span> java.util.ArrayList;
<span class="hljs-keyword">import</span> java.util.List;

<span class="hljs-keyword">public</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MainActivity</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">AppCompatActivity</span> {</span>
    List<String> mData;

    <span class="hljs-annotation">@Override</span>
    <span class="hljs-keyword">protected</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onCreate</span>(Bundle savedInstanceState) {
        <span class="hljs-keyword">super</span>.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData(<span class="hljs-number">1</span>);
        initView();
    }

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">initData</span>(<span class="hljs-keyword">int</span> pager) {
        mData = <span class="hljs-keyword">new</span> ArrayList<>();
        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">1</span>; i < <span class="hljs-number">50</span>; i++) {
            mData.add(<span class="hljs-string">"pager"</span> + pager + <span class="hljs-string">" 第"</span> + i + <span class="hljs-string">"个item"</span>);
        }
    }

    <span class="hljs-keyword">private</span> <span class="hljs-keyword">void</span> <span class="hljs-title">initView</span>() {
        <span class="hljs-comment">//设置ToolBar</span>
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar.setTitle(<span class="hljs-string">""</span>);
        setSupportActionBar(toolbar);<span class="hljs-comment">//替换系统的actionBar</span>

        <span class="hljs-comment">//设置TabLayout</span>
        TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);
        <span class="hljs-keyword">for</span> (<span class="hljs-keyword">int</span> i = <span class="hljs-number">1</span>; i < <span class="hljs-number">20</span>; i++) {
            tabLayout.addTab(tabLayout.newTab().setText(<span class="hljs-string">"TAB"</span> + i));
        }
        <span class="hljs-comment">//TabLayout的切换监听</span>
        tabLayout.setOnTabSelectedListener(<span class="hljs-keyword">new</span> TabLayout.OnTabSelectedListener() {
            <span class="hljs-annotation">@Override</span>
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onTabSelected</span>(TabLayout.Tab tab) {
                <span class="hljs-comment">//切换的时候更新RecyclerView </span>
                initData(tab.getPosition()+<span class="hljs-number">1</span>);
                mAdapter.notifyDataSetChanged();
            }

            <span class="hljs-annotation">@Override</span>
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onTabUnselected</span>(TabLayout.Tab tab) {

            }

            <span class="hljs-annotation">@Override</span>
            <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onTabReselected</span>(TabLayout.Tab tab) {

            }
        });
        <span class="hljs-comment">//设置RecycleView</span>
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(<span class="hljs-keyword">new</span> LinearLayoutManager(<span class="hljs-keyword">this</span>, LinearLayoutManager.VERTICAL, <span class="hljs-keyword">false</span>));
        recyclerView.setItemAnimator(<span class="hljs-keyword">new</span> DefaultItemAnimator());
        recyclerView.setAdapter(mAdapter);
    }
    <span class="hljs-comment">//RecyclerView Adapter</span>
    <span class="hljs-keyword">private</span> RecyclerView.Adapter mAdapter = <span class="hljs-keyword">new</span> RecyclerView.Adapter<MyViewHolder>() {


        <span class="hljs-annotation">@Override</span>
        <span class="hljs-keyword">public</span> MyViewHolder <span class="hljs-title">onCreateViewHolder</span>(ViewGroup parent, <span class="hljs-keyword">int</span> viewType) {
            <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> MyViewHolder(getLayoutInflater().inflate(R.layout.item_layout, parent, <span class="hljs-keyword">false</span>));
        }

        <span class="hljs-annotation">@Override</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title">onBindViewHolder</span>(MyViewHolder holder, <span class="hljs-keyword">int</span> position) {
            holder.tv.setText(mData.get(position));
        }

        <span class="hljs-annotation">@Override</span>
        <span class="hljs-keyword">public</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getItemCount</span>() {
            <span class="hljs-keyword">return</span> mData.size();
        }
    };

    class MyViewHolder extends RecyclerView.ViewHolder {
        <span class="hljs-keyword">public</span> TextView tv;

        <span class="hljs-keyword">public</span> <span class="hljs-title">MyViewHolder</span>(View itemView) {
            <span class="hljs-keyword">super</span>(itemView);
            tv = (TextView) itemView.findViewById(R.id.tv_info);
        }
    }
}</code>


转自:http://blog.csdn.net/mchenys/article/details/51544390

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值