Android App在ViewPager中使用Fragment的实例讲解

据说Android最推荐的是在ViewPager中使用FragMent,即ViewPager中的页面不像前面那样用LayoutInflater直接从布局文件加载,而是一个个Fragment。注意这里的Fragment

是android.support.v4.view包里的Fragment,而不是android.app包里的Fragment。

使用v4包里的Fragment的Activity必须继承自FragmentActivity。

其实使用Fragment与前面不使用Fragment非常类似:

第一步 在主布局文件里放一个ViewPager组件

第二步 为每个页面建立布局文件,把界面写好

第三步 为每个页面新建Fragment类,并加载布局文件中的界面

第四部 为ViewPager设定Adapter,只不过这里的Adapter不是PagerAdapter,而是换成

FragmentPagerAdapter,实现两个方法:

getCount():返回页面数目

getItem(position):返回position位置的Fragment。

下面来看一个ViewPager与Fragment实现页面滑动效果的例子:

首先继承FragmentActivity,
为ViewPager提供展示所需的Fragment和FragmentPagerAdapter:
Fragment来指定页面的布局以及功能

// fragment
private class MyFragment extends Fragment { 

  private String text;
  private int color; 

  public MyFragment(String text, int color) {
    this.text = text;
    this.color = color;
  } 

  @Override
  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    TextView tv = new TextView(MainActivity.this);
    tv.setBackgroundColor(color);
    tv.setText(text);
    return tv;
  }
}

adapter指定该Viewpager有多少页面以及那个位置需要显示哪个页面:

// adapter
  private class MyAdapter extends FragmentPagerAdapter {
    public MyAdapter(FragmentManager fm) {
      super(fm);
    } 

    @Override
    public int getCount() {
      return pages.size();
    } 

    @Override
    public Fragment getItem(int arg0) {
      return pages.get(arg0);
    }
  }

设置OnPageChangeListener,指定页面改变时需要做什么其他操作:

@Override
public void onPageScrollStateChanged(int arg0) { 

} 

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
  LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams) tabline.getLayoutParams();
  lp.leftMargin = (int) ((arg0 + arg1) * mTabLineWidth);
  tabline.setLayoutParams(lp);
} 

@Override
public void onPageSelected(int arg0) {
  // set titles
  for (int i = 0; i < titles.size(); i++) {
    if (arg0 == i) {
      titles.get(i).setSelected(true);
    } else {
      titles.get(i).setSelected(false);
    }
  }
}

完整的代码:

package com.hzy.myviewpager; 

import java.util.ArrayList; 

import android.graphics.Color;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.TextView; 

import com.hzy.myviewpager.R.id; 

public class MainActivity extends FragmentActivity implements OnPageChangeListener, OnClickListener { 

  ViewPager pager = null;
  View tabline = null;
  private int mTabLineWidth; 

  // titles
  TextView title1 = null;
  TextView title2 = null;
  TextView title3 = null; 

  ArrayList<TextView> titles = null;
  ArrayList<Fragment> pages = null; 

  @Override
  protected void onCreate(Bundle arg0) {
    super.onCreate(arg0);
    initView();
    initTabline();
  } 

  private void initView() {
    setContentView(R.layout.activity_main);
    pages = new ArrayList<Fragment>();
    titles = new ArrayList<TextView>(); 

    pager = (ViewPager) findViewById(id.main_viewpager);
    title1 = (TextView) findViewById(id.main_tab1);
    title2 = (TextView) findViewById(id.main_tab2);
    title3 = (TextView) findViewById(id.main_tab3); 

    title1.setOnClickListener(this);
    title2.setOnClickListener(this);
    title3.setOnClickListener(this); 

    titles.add(title1);
    titles.add(title2);
    titles.add(title3); 

    // create new fragments
    pages.add(new MyFragment("tab1", Color.BLUE));
    pages.add(new MyFragment("tab2", Color.RED));
    pages.add(new MyFragment("tab3", Color.CYAN)); 

    // set adapter
    pager.setAdapter(new MyAdapter(getSupportFragmentManager()));
    pager.setOnPageChangeListener(this);
    pager.setCurrentItem(0);
    titles.get(0).setSelected(true);
  } 

  // tablines
  private void initTabline() {
    tabline = findViewById(id.main_tab_line);
    Display display = getWindow().getWindowManager().getDefaultDisplay();
    DisplayMetrics outMetrics = new DisplayMetrics();
    display.getMetrics(outMetrics);
    mTabLineWidth = outMetrics.widthPixels / 3;
    LayoutParams lp = tabline.getLayoutParams();
    lp.width = mTabLineWidth;
    tabline.setLayoutParams(lp);
  } 

  @Override
  public void onClick(View v) {
    switch (v.getId()) {
    case id.main_tab1:
      pager.setCurrentItem(0, true);
      break;
    case id.main_tab2:
      pager.setCurrentItem(1, true);
      break;
    case id.main_tab3:
      pager.setCurrentItem(2, true);
      break;
    default:
      break;
    }
  } 

  @Override
  public void onPageScrollStateChanged(int arg0) { 

  } 

  @Override
  public void onPageScrolled(int arg0, float arg1, int arg2) {
    LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams) tabline.getLayoutParams();
    lp.leftMargin = (int) ((arg0 + arg1) * mTabLineWidth);
    tabline.setLayoutParams(lp);
  } 

  @Override
  public void onPageSelected(int arg0) {
    // set titles
    for (int i = 0; i < titles.size(); i++) {
      if (arg0 == i) {
        titles.get(i).setSelected(true);
      } else {
        titles.get(i).setSelected(false);
      }
    }
  } 

  // fragment
  private class MyFragment extends Fragment { 

    private String text;
    private int color; 

    public MyFragment(String text, int color) {
      this.text = text;
      this.color = color;
    } 

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
      TextView tv = new TextView(MainActivity.this);
      tv.setBackgroundColor(color);
      tv.setText(text);
      return tv;
    }
  } 

  // adapter
  private class MyAdapter extends FragmentPagerAdapter {
    public MyAdapter(FragmentManager fm) {
      super(fm);
    } 

    @Override
    public int getCount() {
      return pages.size();
    } 

    @Override
    public Fragment getItem(int arg0) {
      return pages.get(arg0);
    }
  }
}

代码中通过实现OnPageChangeListener接口手动设置了页面指示条的位置。

时间: 2016-03-21

Android中ViewPager获取当前显示的Fragment

前言 在项目中,有时会用到在ViewPager中显示同样类型的Fragment,同时这样的Fragment的个数是动态的,但是PagerAdapter没有给我们提供getCurrentFragment类似的方法.下面就给大家介绍下Android中ViewPager获取当前显示的Fragment的方法,一起看看吧. 一.使用 getSupportFragmentManager().findFragmentByTag()方法 Viewpager + FragmentPagerAdapter 情况下

Android实现Tab布局的4种方式(Fragment+TabPageIndicator+ViewPager)

Android现在实现Tab类型的界面方式越来越多,今天就把常见的实现方式给大家来个总结.目前写了: 1.传统的ViewPager实现 2.FragmentManager+Fragment实现 3.ViewPager+FragmentPagerAdapter实现 4.TabPageIndicator+ViewPager+FragmentPagerAdapter 1.传统的ViewPager实现 主要就是ViewPager+ViewAdapter这个还是比较常见的,就不多说了 效果图: 代码: p

android 中viewpager+fragment仿微信底部TAG完美渐变

viewpager+fragment仿微信底部TAG完美渐变,在图片渐变的同时字的颜色也在变,注意,是渐变哦! 效果图: activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:zhy="http://schemas.android.com/apk/res/com.Sing.weixin" xmlns:tools="

Android中ViewPager实现滑动指示条及与Fragment的配合

自主实现滑动指示条 先上效果图: 1.XML布局 布局代码如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match

Android中ViewPager和Fragment的使用

小案例 XML中 <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="match_parent"> </android.support.v4.view.ViewPager> 创建Fragment fragments = new Arr

Android基于ViewPager Fragment实现选项卡

先给大家展示效果图: 1.新建TestFragmen继承Fragment public class TestFragment extends Fragment { private static final String TAG = "TestFragment"; private String hello;// = "hello android"; private String defaultHello = "default value"; pri

Android 开发之BottomBar+ViewPager+Fragment实现炫酷的底部导航效果

BottomBar BottomBar是Github上的一个开源框架,因为从1.3.3开始不支持fragments了,要自己配置,弄了很久,不管是app的fragment还是V4 的程序总是总是闪退.于是就用这种方式实现了,效果还不错.github有详细说明,多余的就不说了. 这个roughike是这个项目的所有者(大神致敬). 我用的是Android studio开发,fragment全部导的V4的包(以为最开始就支持的是v4的,后面也支持了app.fragment). 首先是dependen

Android App中使用ViewPager+Fragment实现滑动切换效果

在android应用中,多屏滑动是一种很常见的风格,没有采用viewpager的代码实现会很长,如果采用ViewPager,代码就会短很多,但是使用ViewPager也有弊端:需要导入android-support-v4.jar.细节无法控制.不过现在情况已经不一样了,android-support-v4中提供了很多实用的功能,以至于现在新建一个android工程默认都会导入这个jar包.那我们就也采用viewpager来做滑动吧.另外一个概念就是Fragment和FragmentActivit

Android App中ViewPager与Fragment结合的一些问题解决

在了解ViewPager的工作原理之前,先回顾ListView的工作原理: ListView只有在需要显示某些列表项时,它才会去申请可用的视图对象:如果为所有的列表项数据创建视图对象,会浪费内存: ListView找谁去申请视图对象呢? 答案是adapter.adapter是一个控制器对象,负责从模型层获取数据,创建并填充必要的视图对象,将准备好的视图对象返回给ListView: 首先,通过调用adapter的getCount()方法,ListView询问数组列表中包含多少个对象(为避免出现数组

Android仿微信Viewpager-Fragment惰性加载(lazy-loading)

前言 今天起床,拿起手机开机第一时间当然是打开微信了,左右滑动Viewpager,发现它使用了一种叫惰性加载,或者说懒加载(lazy-loading)的方式加载Viewpager中的Fragment.效果如图: 什么是lazy-loading呢?顾名思义就是在必要的时候才加载,否则不进行View的绘制和数据的加载.原因是Viewpager一次只会显示一个页卡,那么刚开始的时候,只需加载第一张Fragment页卡,其他的不加载,当用户向右滑动切换再进行加载.因为其他Fragment对于用户来说是不

android ListView结合xutils3仿微信实现下拉加载更多

前言:最近涉及到和QQ打交道,定义所有的好友一共只能有300条消息,如果一次性从数据库读取300条或者更多,界面会有细微的卡顿.所以考虑了下分页,第一次进来只显示20条(仿微信),当用户滑到第一条后,如果数据库有消息,则再加载20条. 步骤-问把大象关冰箱,总共分几步? 1.自定义absListview.scrollListerner 核心的东西是监听ListView的scrollListerner,这里采取拿来主义 原文连接找不到了,如果原作者看到,请联系青楼爱小生,将您的文章链接更新出来 ,

Android 多层嵌套后的 Fragment 懒加载实现示例

多层嵌套后的 Fragment 懒加载 印象中从 Feed 流应用流行开始,Fragment 懒加载变成了一个大家都需要关注的开发知识,关于 Fragment 的懒加载,网上有很多例子,GitHub 上也有很多例子,就连我自己在一年前也写过相关的文章.但是之前的应用可能最多的是一层 Activity + ViewPager 的 UI 层次,但是随着页面越来越复杂,越来越多的应用首页一个页面外层是一个 ViewPager 内部可能还嵌套着一层 ViewPager,这是之前的懒加载就可能不那么好用了

Android仿微信网络加载弹出框

本文实例为大家分享了Android仿微信网络加载弹出框的具体代码,供大家参考,具体内容如下 没有饿了么的动画效果好看,但是,特别适用,拿来就用! 看一下效果图 图片素材 好了,其实很简单,就是一个自定义Dialog的控件而已 1. 自定义view的style样式 <resources> <!-- Base application theme. --> <style name="AppTheme" parent="Theme.AppCompat.L

Android仿今日头条多个fragment懒加载的实现

前言 最近有时间,所以我又双叒叕推新一篇文章了,fragment懒加载实现虽然是个小模块,但做过的人都有体会,通常并不会轻易就成功了的,让你辗转反侧,彻夜难眠,绵绵无绝期.我就按照今日头条的样式做了一个懒加载功能.文章到一半会解释大家可能遇到的不加载数据了的坑,先不剧透. Fragment的生命周期回顾 github代码直通车 (本地下载) 这里是今日头条效果: 自制效果,有图有真相: 实现思路: 使用Fragment类自带方法setUserVisibleHint()判断当前fragment是否

Android 开发中fragment预加载问题

我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在这个activity刚创建的时候就变成需要初始化大量资源.这样的结果,我们当然不会满意.那么,能不能做到当切换到这个fragment的时候,它才去初始化呢? 答案就在Fragment里的setUserVisibleHint这个方法里.请看关于Fragment里这个方法的API文档(国内镜像地址:ht

Android中Fragment的加载方式与数据通信详解

一.加载方式 1. 静态加载 1.1 加载步骤 (1) 创建fragment:创建自定义Fragment类继承自Fragment类,同时将自定义Fragment类与Fragment视图绑定(将layout转换成View) View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) inflater用于绑定Fragment的布局文件,同时将该布局转换成View对象并返回:con

Android仿微信发朋友圈浏览图片效果

先看一下效果吧: 下面就来说一下具体怎么实现的: 实现思路 1.首先我们要获取数据源,数据源就是我们的每条说说(包括姓名.标题.图片数组) 2.自定义适配器(ListView嵌套着GridView) 3.图片点击浏览图片(Fragment+ViewPager) 具体实现 1.初始化数据源,设置适配器,看一下代码: public class MyActivity extends Activity { /*图片显示列表*/ private ListView listView; /*图片URL数组*/

Android实现简单底部导航栏 Android仿微信滑动切换效果

Android仿微信滑动切换最终实现效果: 大体思路: 1. 主要使用两个自定义View配合实现; 底部图标加文字为一个自定义view,底部导航栏为一个载体,根据需要来添加底部图标; 2. 底部导航栏的设置方法类似于TabLayout的关联,View需要创建关联方法,用来关联VIewPager; 3. 通过关联方法获取ViewPager实例后,根据ViewPager页面数创建底部导航栏的图标按钮; 代码实现: 1. 新建第一个自定义View, 图标 + 文字 的底部按钮; /** * 自定义控件

Android 仿微信朋友圈点赞和评论弹出框功能

贡献/下载源码:https://github.com/mmlovesyy/PopupWindowDemo 本文简单模仿微信朋友圈的点赞和评论弹出框,布局等细节请忽略,着重实现弹出框.发评论,及弹出位置的控制. 1. 微信弹出框 微信朋友圈的点赞和评论功能,有2个组成部分: 点击左下角的"更多"按钮,弹出对话框: 点击评论,弹出输入框,添加评论并在页面中实时显示: 微信朋友圈点赞和评论功能 2. 实际效果 本文将建一个 ListView,在其 Item 中简单模仿微信的布局,然后着重实现