`
hzy3774
  • 浏览: 984818 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Android控件ViewPager与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接口手动设置了页面指示条的位置

  • 大小: 77 KB
分享到:
评论

相关推荐

    Android CardView+ViewPager实现ViewPager翻页动画的方法

    Viewpager通俗一点讲就是一个允许左右翻转带数据的页面的布局管理器,经常用来连接Fragment,它很方便管理每个页面的生命周期,使用ViewPager管理Fragment是标准的适配器实现。最常用的实现一般有...

    详解Android 在 ViewPager 中使用 Fragment 的懒加载

    可能有人会说 ViewPager 有 viewPager.setOffscreenPageLimit() 的方法,我们传个 0 进去不就好了吗?看过源码的应该知道,即便你传了 0 进去,系统也会默认为 1 的,也就是 ViewPager 依然会加载当前页面的前后各一...

    Android App中ViewPager所带来的滑动冲突问题解决方法

    滑动冲突可以说是日常开发中比较常见的一类问题,也是比较让人头疼的一类问题,尤其是在使用第三方框架的时候,两个原本完美的控件,组合在一起之后,忽然发现整个世界都不好了。 关于滑动冲突 滑动冲突分类: 滑动...

    Android应用源码之ViewPager+ViewFillper+ViewFlow的使用方法.zip项目安卓应用源码下载

    Android应用源码之ViewPager+Fragment侧滑选项卡,浏览器控件,两次退出.zip项目安卓应用源码下载Android应用源码之ViewPager+Fragment侧滑选项卡,浏览器控件,两次退出.zip项目安卓应用源码下载 1.适合学生毕业...

    TabLayoutNiubility:Android自定义控件之RecyclerView打造万能ViewPager TabLayout(仿今日头条Tab滑动、Tab多布局、indicator蠕动、自定义indicator、文字颜色渐变、自定义Fragment)

    使用方法 注意:该轮子适用于androidx中的ViewPager2和ViewPager 注意:如果轮子死活下载不下来,说明maven地址有毛病,你需要找到jitpack的官网首页,查看最新的官网地址 注意:记得去gayhub查看最新版本,最新版本...

    详解Android开发技巧之PagerAdapter实现类的封装

    ViewPager是android的support库中的一个控件,也是一个在许多应用开发中都用得比较多的控件。目前为止,对ViewPager的使用,我一般是用ViewPager + Fragment的组合,偶尔也有ViewPager加View的组合。关于ViewPager +...

    Android优化方案之Fragment的懒加载实现代码

    在Android应用中,ViewPager是我们不可避免使用的一个控件,因为它可以使我们在占用较少空间的同时,增强内容的丰富性,同时以其内部流淌着Google的血液,所以它几乎成了每一个App的标配控件。但是,假如ViewPager的...

    Android一个Demo搞定所有控件

    本人在学习基础控件的时候写的,运行环境是在Android 4.2。 包含Fragment和viewPager和HorizontalScrollView,actionBar等比较新的控件的使用方法

    android TabLayout使用方法详解

    Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来了全新的Android Design Support Library,在这个support库里面,Google给我们提供了更加规范的MD设计风格的控件。...

    Android项目源码一款基于MVP设计模式开发的仿淘宝APP.zip

    ViewPager和Fragment结合使用,Fragment出现被预计载的情况 解决方案 项目中使用的主要技术及框架 框架 ButterKnife 注解绑定获取控件功能 Picasso 网络和本地图片的加载功能 okhttp 网络连接功能

    TabLayout实现ViewPager指示器的方法

    现在Android内部提供了现成的TabLayout控件来实现ViewPager指示器的效果。 先看效果图: 导入依赖 在Gradle文件中导入依赖,代码如下: compile 'com.android.support:design:23.4.0' TabLayout类就在这个依赖包中...

    浅谈Android View滑动冲突的解决方法

    考虑这样一种场景,开发中我们经常使用ViewPager和Fragment配合使用所组成的页面滑动效果,很多主流的应用都会使用这样的效果。在这种效果中,可以使用左右滑动来切换界面,而每一个界面里面往往又都是ListView这样...

    高仿微信界面

    现在三个Fragment已经添加到了MainActivity中,滑动ViewPager切换Fragment,同时底部的导航栏也会切换,在为ViewPager添加监听以前,先说说底部导航栏。 第二步,底部导航。 这个的切换其实就是切换准备好的png...

    Android滑动冲突问题的解决方法

    滑动冲突可以说是日常开发中比较常见的一类问题,也是比较让人头疼的一类问题,尤其是在使用第三方框架的时候,两个原本完美的控件,组合在一起之后,忽然发现整个世界都不好了。 关于滑动冲突 滑动冲突分类 滑动...

    android仿Adapter实现自定义PagerAdapter方法示例

    PagerAdapter简介 ...PagerAdapter主要是viewpager的适配器,而viewPager则也是在android.support.v4扩展包中新添加的一个强大的控件,可以实现控件的滑动效果,比如咱们在软件中常见的广告栏的滑动效果,用vi

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

    使用ViewPager,PagerSlidingTabStrip,SwipeRefreshLayout打造一款可以点击可以侧滑的顶部导航栏。...2.把PagerSlidingTabStrip这个控件添加到你的布局中,它通常会放在ViewPager的上面 &lt;com.astuetz.PagerS

    Android TabLayout(选项卡布局)简单用法实例分析

    本文实例讲述了Android TabLayout(选项卡布局)简单用法。分享给大家供大家参考,具体如下: 我们在应用viewpager的时候,经常会使用TabPageIndicator来与其配合。达到很漂亮的效果。但是TabPageIndicator是第三方的...

    Android程序开发之使用Design包实现QQ动画侧滑效果和滑动菜单导航

    Google在2015的IO大会上,给我们带来了更加详细的Material Design设计规范,同时,也给我们带来...使用方法很简单,只需要添加一句依赖 compile ‘com.android.support:design:24.0.0’ 先用TabLayout和SnackBar以及N

    安卓无限轮播Banner效果案例

    顶层使用LoopView,该控件继承ViewGroup,是一个可以无限轮播的ViewPager第二层使用Trina的AutoScrollViewPager,作为启动器.第三层AutoLoopViewPager,用于功能增强,现在提供了自定义属性scale,用于设置宽高比ViewPager...

Global site tag (gtag.js) - Google Analytics