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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, viewpager
fragment
android fragment实例、viewpager fragment、fragment和viewpager、fragment套viewpager、fragment与viewpager,以便于您获取更多的相关知识。

时间: 2024-09-13 11:06:11

Android App在ViewPager中使用Fragment的实例讲解_Android的相关文章

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非常类似:

Android App在线程中创建handler的方法讲解_Android

相关概念1.Handler:可以看做是一个工具类,用来向消息队列中插入消息的; 2.Thread:所有与Handler相关的功能都是与Thread密不可分的,Handler会与创建时所在的线程绑定; 3.Message:消息; 4.MessageQueue:消息队列,对消息进行管理,实现了一个Message链表; 5.Looper:消息循环,从MessageQueue中取出Message进行处理: 6.HandlerThread:继承Thread,实例化时自动创建Looper对象,实现一个消息循

Android App在线程中创建handler的方法讲解

相关概念 1.Handler:可以看做是一个工具类,用来向消息队列中插入消息的; 2.Thread:所有与Handler相关的功能都是与Thread密不可分的,Handler会与创建时所在的线程绑定; 3.Message:消息; 4.MessageQueue:消息队列,对消息进行管理,实现了一个Message链表; 5.Looper:消息循环,从MessageQueue中取出Message进行处理: 6.HandlerThread:继承Thread,实例化时自动创建Looper对象,实现一个消息

viewpager中的fragment之间跳转传值问题?

问题描述 viewpager中的fragment之间跳转传值问题? 有一个是Activity,在里面有viewpager的实现,ViewPager显示的是10个子fragment,ViewPager中使用的是FragmentStatePagerAdapter适配器.现在已经可以左右滑动切换1-10个Fragment了,我现在想实现的功能是:每个Fragment中都有几个button,点击第一个Fragment中的button,相当于右滑了一下,跳到了下一个Fragment.能跳过去了,但是从第一

java-给 ViewPager 中的 fragment 添加空的构造函数

问题描述 给 ViewPager 中的 fragment 添加空的构造函数 我想创建了一个布局,类似 Google play's.我使用 ViewPager ,需要 fragment.我查了一些资料说一个 fragment 需要一个空的构造函数,但是事例中在 developer.android.com 不包含一个构造函数. 事例代码如下: public static class DemoObjectFragment extends Fragment { public static final S

替换viewpager中的fragment的问题

问题描述 替换viewpager中的fragment的问题 ViewPager中有FragmentA和FragmentB,点击FragmentA中的按钮,把FragmentA替换成FragmentC.如何实现?? 解决方案 ViewPager+Fragment问题ViewPager+Fragment实现选项卡,并且完美解决刷新和替换Fragment的问题viewpager添加fragment问题 解决方案二: viewpager adapter 有一个参数Fragment 的集合 点击按钮操作这

请求数据传输问题-activity请求数据传给viewpager中的fragment

问题描述 activity请求数据传给viewpager中的fragment 怎么设计在activity中请求数据后把数据传给viewpager中的fragment 并且每次activity请求数据后及时刷新UI?能有代码例子更好 解决方案 activity- (ViewPager)--->Fragment 解决方案二: 可以用: 1.broadcast广播来实现,在activity请求数据成功获取数据处发送广播,在你fragment中接收广播,然后刷新对应UI: 2.用EventBus或者ot

求大神解决!!!viewpager中的fragment替换

问题描述 求大神解决!!!viewpager中的fragment替换 我做了一个viewpager,里面有三个tab,可以滑动切换.现在在第一个tab中有按钮,点击按钮将这个tab替换成其他fragment.如何实现? 不影响另外两个tab. 解决方案 ActionBar+ViewPager.http://blog.csdn.net/shdhenghao3/article/details/40043339

Android:下拉刷新+加载更多+滑动删除实例讲解_Android

         小伙伴们在逛淘宝或者是各种app上,都可以看到这样的功能,下拉刷新和加载更多以及滑动删除,刷新,指刷洗之后使之变新,比喻突破旧的而创造出新的,比如在手机上浏览新闻的时候,使用下拉刷新的功能,我们可以第一时间掌握最新消息,加载更多是什么nie,简单来说就是在网页上逛淘宝的时候,我们可以点击下一页来满足我们更多的需求,但是在手机端就不一样了,没有上下页,怎么办nie,方法总比困难多,细心的小伙伴可能会发现,在手机端中,有加载更多来满足我们的要求,其实加载更多也是分页的一种体现.小伙