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接口手动设置了页面指示条的位置。

(0)

相关推荐

  • 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实现选项卡

    先给大家展示效果图: 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实现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的使用

    小案例 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 App中使用ViewPager+Fragment实现滑动切换效果

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

  • Android中ViewPager获取当前显示的Fragment

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

  • 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 中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惰性加载(lazy-loading)

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

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

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

随机推荐