Android实现顶部导航栏可点击可滑动效果(仿微信仿豆瓣网)

使用ViewPager,PagerSlidingTabStrip,SwipeRefreshLayout打造一款可以点击可以侧滑的顶部导航栏。

先简单介绍一下所用的两个个开源库。

PagerSlidingTabStrip

Github地址

用法:

1.向app Module中的build.gradle中添加依赖

dependencies {
compile 'com.astuetz:pagerslidingtabstrip:1.0.1'
} 

2.把PagerSlidingTabStrip这个控件添加到你的布局中,它通常会放在ViewPager的上面

<com.astuetz.PagerSlidingTabStrip
  android:id="@+id/tabs"
  android:layout_width="match_parent"
  android:layout_height="48dip" /> 

3.在你的onCreate()方法中(或者是在Fragment里面的onCreateView()方法中),把PagerSlidingTabStrip跟ViewPager绑定在一起

// Initialize the ViewPager and set an adapter
 ViewPager pager = (ViewPager) findViewById(R.id.pager);
 pager.setAdapter(new TestAdapter(getSupportFragmentManager()));
 // Bind the tabs to the ViewPager
 PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs);
 tabs.setViewPager(pager); 

4.如果你要设置PagerChange监听的话

// continued from above
tabs.setOnPageChangeListener(mPageChangeListener); 

至于它里面的其他很多方法我在这里就不多讲了,需要了解的同学可以去看下Github。

SwipeRefreshLayout

SwipeRefreshLayout是谷歌官方出的一款下拉刷新的控件,只支持下拉刷新,并不支持上拉加载,当然,Github里面也有人基于这个控件写了上拉加载的开源框架,嘻嘻,下一篇给你们介绍。

用法:

1.在xml文件中添加Android.support.v4.widget.SwipeRefreshLayout

<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:id="@+id/refresh_layout"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <ListView
    android:id="@+id/lv"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout> 

2.下拉时若需要出发事件,需实现SwipeRefreshLayout.OnRefreshListener,重写onRefresh()方法。

仿豆瓣实现滑动效果

首先我们先看到MainActivity.class

package com.example.dragonhaw.doubandemo;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.view.Window;
import com.astuetz.PagerSlidingTabStrip;
import com.example.dragonhaw.doubandemo.fragment.PagerFragment;
import com.example.dragonhaw.doubandemo.fragment.RefreshFragment;
/**
 * Created by dragonhaw at 9/13/2016
 */
public class MainActivity extends AppCompatActivity {
  /**
   * Page的数量
   */
  private static final int PAGER_NUM = 4;
  /**
   * PagerSlidingTabStrip的对象
   */
  private PagerSlidingTabStrip pagerSlidingTabStrip;
  /**
   * ViewPager的对象
   */
  private ViewPager viewPager;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //隐藏ActionBar,此方法必须写在setContentView的前面,因为必须在contentView未加载之前将其去掉
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);
    initView();
  }
  /**
   * 初始化View
   */
  private void initView() {
    pagerSlidingTabStrip = (PagerSlidingTabStrip) findViewById(R.id.pager_tabs);
    viewPager = (ViewPager) findViewById(R.id.pager);
    //设置ViewPager每次预加载3个pager,也就是除当前pager外另外加载了三个pager,默认为1
    viewPager.setOffscreenPageLimit(3);
    viewPager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager()));
    pagerSlidingTabStrip.setViewPager(viewPager);
  }
  public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
    private String[] Titles = new String[]{
        "豆瓣", "发现", "讨论", "我的"
    };
    public MyFragmentPagerAdapter(FragmentManager fm) {
      super(fm);
    }
    /**
     * 回调此方法得到Title内容
     */
    @Override
    public CharSequence getPageTitle(int position) {
      return Titles[position];
    }
    /**
     * 回调此方法得到Fragment,这里使用Bundle是为了给PagerFragment里面的TextView传入数据
     */
    @Override
    public Fragment getItem(int position) {
      Bundle bundle = new Bundle();
      Fragment pagerFragment;
      if (position == 0) {
        pagerFragment = new RefreshFragment();
      } else {
        pagerFragment = new PagerFragment();
      }
      bundle.putInt("pager_num", position);
      pagerFragment.setArguments(bundle);
      return pagerFragment;
    }
    /**
     * 回调此方法得到Pager的个数
     */
    @Override
    public int getCount() {
      return PAGER_NUM;
    }
  }
} 

整个MainActivity应该没什么好说的吧,难理解的地方我都注释了。然后我们写Fragment,在这里我们写两个Fragment,第一个Fragment也就是首页,要实现ListView跟下拉刷新的那个Fragment,RefreshFragment.class代码如下:

package com.example.dragonhaw.doubandemo.fragment;
 import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import com.example.dragonhaw.doubandemo.R;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by dragonhaw on 2016/9/13.
 */
public class RefreshFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener{
  private SwipeRefreshLayout swipeRefreshLayout;
  private ListView listView;
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view =inflater.inflate(R.layout.fragment_refresh, container, false);
    swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.refresh_layout);
    swipeRefreshLayout.setOnRefreshListener(this);
    //为下拉刷新的设置四种颜色
    swipeRefreshLayout.setColorSchemeResources(
        android.R.color.holo_blue_light,
        android.R.color.holo_green_light,
        android.R.color.holo_green_light,
        android.R.color.holo_orange_light
    );
    listView = (ListView) view.findViewById(R.id.lv);
    listView.setAdapter(new ArrayAdapter<String >(getActivity(), android.R.layout.simple_list_item_1,getData()));
    return view;
  }
  @Override
  public void onRefresh() {
    swipeRefreshLayout.setRefreshing(true);
    new Handler().postDelayed(new Runnable() {
      @Override
      public void run() {
        swipeRefreshLayout.setRefreshing(false);
      }
    }, 3000);
  }
  public List<String> getData() {
    List<String> data = new ArrayList<>();
    for (int i = 0; i < 30; i++) {
      data.add("数据" + i);
    }
    return data;
  }
} 

SwipeRefreshLayout的setColorSchemeResources()方法,是给下拉刷新的那个圆圈设置颜色,最多可以设置四种颜色,这个框架在Android5.0之前是一个横线的颜色变化,很一般,一点都不好看,但是在Android5.0后就变为了一个圆圈的变化,很多APP都用的它,比如说斗鱼tv等。

另外,在onRefresh()方法中,我们设置了三秒钟刷新完成,即setRefreshing()中状态从true变为false。

再接下来我们又建一个Fragment,PagerFragment.class代码如下:

package com.example.dragonhaw.doubandemo.fragment;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.example.dragonhaw.doubandemo.R;
/**
 * Created by dragonhaw on 2016/9/13.
 */
public class PagerFragment extends Fragment {
  private TextView textView;
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_pager, container, false);
    textView = (TextView) view.findViewById(R.id.text);
    Bundle bundle = getArguments();
    int pager = bundle.getInt("pager_num");
    textView.setText("" + pager);
    return view;
  }
} 

MainActivity的布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context=".MainActivity">
  <com.astuetz.PagerSlidingTabStrip
    android:id="@+id/pager_tabs"
    android:layout_width="match_parent"
    android:layout_height="48dp"
    android:background="#ff2d2d2d"
    android:textColor="#ff8f8f8f"
    android:textSize="18sp"
    app:pstsIndicatorColor="#ff00cd79"
    app:pstsIndicatorHeight="4dp"
    app:pstsShouldExpand="true" />
  <android.support.v4.view.ViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
</LinearLayout> 

PagerFragment的布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="match_parent"
  android:layout_height="match_parent">
  <TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text=""
    android:textSize="50sp"
    android:gravity="center"
    />
</LinearLayout> 

RefreshFragment的布局文件如下:

<android.support.v4.widget.SwipeRefreshLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/refresh_layout"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  >
  <ListView
    android:id="@+id/lv"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
</android.support.v4.widget.SwipeRefreshLayout> 

以上所述是小编给大家介绍的Android实现顶部导航栏可点击可滑动效果(仿微信仿豆瓣网),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android实现底部导航栏功能(选项卡)

    现在很多android的应用都采用底部导航栏的功能,这样可以使得用户在使用过程中随意切换不同的页面,现在我采用TabHost组件来自定义一个底部的导航栏的功能. 我们先看下该demo实例的框架图: 其中各个类的作用以及资源文件就不详细解释了,还有资源图片(在该Demo中借用了其它应用程序的资源图片)也不提供了,大家可以自行更换自己需要的资源图片.直接上各个布局文件或各个类的代码: 1. res/layout目录下的 maintabs.xml 源码: <?xml version="1.0&q

  • Android程序开发之Fragment实现底部导航栏实例代码

    流行的应用的导航一般分为两种,一种是底部导航,一种是侧边栏. 说明 IDE:AS,Android studio; 模拟器:genymotion; 实现的效果,见下图. 具体实现 为了讲明白这个实现过程,我们贴出来的代码多一写,这样更方便理解 [最后还会放出完整的代码实现] .看上图的界面做的比较粗糙,但实现过程的骨架都具有了,想要更完美的设计,之后自行完善吧 ^0^. 布局 通过观察上述效果图,发现任意一个选项页面都有三部分组成: 顶部去除ActionBar后的标题栏: 中间一个Fragment

  • Android设置透明状态栏和透明导航栏

    Android透明状态栏只有在4.4之后有. 在代码中加入下面几行代码即可实现 以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

  • Android design包自定义tablayout的底部导航栏的实现方法

    以前做项目大多用的radiobutton,今天用tablayout来做一个tab切换页面的的效果. 实现的效果就是类似QQ.微信的页面间(也就是Fragment间)的切换.如图: 布局只要一个tablayout <android.support.design.widget.TabLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:id=&

  • Android自定义View实现字母导航栏的代码

    思路分析: 1.自定义View实现字母导航栏 2.ListView实现联系人列表 3.字母导航栏滑动事件处理 4.字母导航栏与中间字母的联动 5.字母导航栏与ListView的联动 效果图: 首先,我们先甩出主布局文件,方便后面代码的说明 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/re

  • Android实现沉浸式导航栏实例代码

    废话不多说了,直接给大家贴代码了,具体代码如下所示: private SystemBarTintManager tintManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // getWindow().addFlags(WindowManager.Layo

  • Android仿网易客户端顶部导航栏效果

    最近刚写了一个网易客户端首页导航条的动画效果,现在分享出来给大家学习学习.我说一下这个效果的核心原理.下面是效果图: 首先是布局,这个布局是我从网易客户端反编译后弄来的.大家看后应该明白,布局文件如下: <FrameLayout android:id="@id/column_navi" android:layout_width="fill_parent" android:layout_height="wrap_content" androi

  • Android项目实战之仿网易顶部导航栏效果

    随着时间的推移现在的软件要求显示的内容越来越多,所以要在小的屏幕上能够更好的显示更多的内容,首先我们会想到底部菜单栏,但是有时候想网易新闻要显示的内容太多,而且又想在主页面全部显示出来,所以有加了顶部导航栏,但是Android这样的移动设备内存是受限的,那么多界面缓存到内存中,很容易导致内存溢出,这个是比较致命的,所以不得不考虑.虽然我在之前也做过网易的顶部导航栏但是方式并不好,就像使用viewpager做一些复杂的界面由于图片占用内存过多,很容易导致内存溢出,学习了今天的内容大家做一下对比相信

  • Android实现沉浸式通知栏通知栏背景颜色跟随app导航栏背景颜色而改变

    最近好多app都已经满足了沉浸式通知栏, 所谓沉浸式通知栏:就是把用来导航的各种界面操作空间隐藏在以程序内容为主的情景中,通过相对"隐形"的界面来达到把用户可视范围最大化地用到内容本身上. 而最新安卓4.4系统的通知栏沉浸模式就是在软件打开的时候通知栏和软件顶部颜色融为一体,这样不仅可以使软件和系统本身更加融为一体. 就是手机的通知栏的颜色不再是白色.黑色简单的两种了,本人用的小米4手机,米4手机中的自带软件都支持沉浸式通知栏, 举个例子:大家可以看一下自己的qq,它的标题的背景颜色是

  • Android实现顶部导航栏可点击可滑动效果(仿微信仿豆瓣网)

    使用ViewPager,PagerSlidingTabStrip,SwipeRefreshLayout打造一款可以点击可以侧滑的顶部导航栏. 先简单介绍一下所用的两个个开源库. PagerSlidingTabStrip Github地址 用法: 1.向app Module中的build.gradle中添加依赖 dependencies { compile 'com.astuetz:pagerslidingtabstrip:1.0.1' } 2.把PagerSlidingTabStrip这个控件添

  • Android自定义顶部导航栏控件实例代码

    下面一段代码给大家介绍了android 自定义顶部导航栏控件功能,具体代码如下所示: class HeaderBar @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : FrameLayout(context, attrs, defStyleAttr) { //重写构造方法 在java里面 我们一般是重写三个构造方法//在kotlin中 我们可以使用

  • 微信小程序顶部导航栏可滑动并选中放大

    这篇文章主要介绍了微信小程序顶部导航栏可滑动并选中放大,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 老规矩,先看效果图 可以看到我们实现了如下功能 1,顶部导航栏 2,可以左右滑动的导航栏 3,选中条目放大 原理其实很简单,我这里把我研究后的源码发给大家吧. wxml文件如下 <!-- 导航栏 --> <scroll-view scroll-x class="navbar" scroll-with-animatio

  • Android仿今日头条顶部导航栏效果的实例代码

    随着时间的推移现在的软件要求显示的内容越来越多,所以要在小的屏幕上能够更好的显示更多的内容,首先我们会想到底部菜单栏,但是有时候像今日头条新闻客户端要显示的内容太多,而且又想在主界面全部显示出来,所以有加了顶部导航栏. 今日头条顶部导航栏区域的主要部分是一个导航菜单.导航菜单是一组标签的集合,在新闻客户端中,每个标签标示一个新闻类别,对应下面ViewPager控件的一个分页面.当用户在ViewPager区域滑动页面时,对应的导航菜单标签也会相应的被选中,选中的标签通过一个矩形红框高亮显示,红框背

  • 微信小程序点击顶部导航栏切换样式代码实例

    这篇文章主要介绍了微信小程序点击顶部导航栏切换样式代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 类似这样的效果 <view class='helpCateList'> <!-- 类别 --> <scroll-view class='scroll-view' scroll-x="true"> <view class="item-content" wx:key=&qu

  • android实现底部导航栏

    底部导航栏我选择用FragmentTabHost+Fragment来实现,这个方法比较好用,代码量也不多 首先是开始的activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_

  • 微信小程序中顶部导航栏的实现代码

    微信小程序中顶部导航栏的实现 实例代码: <view class="swiper-tab"> <view class="swiper-tab-list {{currentTab==0 ? 'on' : ''}}" data-current="0" bindtap="swichNav">11</view> <view class="swiper-tab-list {{curre

  • ViewPager顶部导航栏联动效果(标题栏条目多)

    如果标题栏过多,超过屏幕的宽度,该怎么弄,下面我们就来解决一下,效果如下: 其实和之前写的也差不多,我就是在哪个demo里面添加和修改了一下,就加了几个title标题,加了几个图片,最重要的是给TableLayout添加了一个属性: app:tabMode="scrollable" 这个属性就是设置设置TableLayout可以滚动,看我滚动上面的标题栏: 这里我还给标题栏设置了几个附加的属性,让它显得更好看: <span style="white-space:pre&

随机推荐