viewpager销毁 切换的时候 会销毁fragmen吗

2342人阅读
转载请注明出处:& 来自《LiaBin的博客》
ViewPager简介
ViewPager不用多说,是v4包中的一个控件,可以用来实现屏幕间的切换。
&android.support.v4.view.ViewPager /&
跟listview一样,需要使用适配器,PagerAdapter
PagerAdapter 必须重写的四个函数:
boolean isViewFromObject(View arg0, Object arg1)int getCount() void destroyItem(ViewGroup container, int position,Object object)Object instantiateItem(ViewGroup container, int position)
ViewPager+Fragment配合使用
普通实现可以通过PageAdapter中添加View来实现,android官方最推荐的一种实现方法却是使用fragment。可以使用如下两种adapter
FragmentPagerAdapter/FragmentStatePagerAdapter 都是继承自PagerAdapter,必须重写一下两个函数
getItem(int)getCount()
存在的问题
1. 默认情况下,ViewPager会根据setOffscreenPageLimit()方法设置的大小,自动预加载
2. 还是根据setOffscreenPageLimit()方法设置的大小,会去销毁fragment视图
下面的图说明情况
滑动fragment1,此时会预加载fragment2,滑动到fragment2会预加载fragment3,但是滑动到fragment3,此时会调用fragment1的destroyview方法,销毁视图。当重新滑动到fragment1才会重新调用fragment1的oncreateview方法。注意此时并不会销毁实例,不会调用ondestroy方法
这样就存在两个问题
pagerview频繁切换,导致fragment1.fragment3在频繁的调用destroyview和oncreateview方法,重新创建视图。这样也浪费了大量的资源,用户体验不佳,虽然内存消耗比较低因为切换到fragment1的时候,同时预加载了fragment2,如果此时fragment2也有大量的耗时网络请求要做,如果应用对启动反应速度比较敏感,所以此时做了多余的工作。能否把这些耗时的工作延迟加载,也是个问题
1.& 防止频繁的销毁视图,setOffscreenPageLimit(2)/或者重写PagerAdaper的destroyItem方法为空即可
setOffscreenPageLimit(2)
//Set the number of pages that should be retained to either side of the current page in the view hierarchy in an idle state.Pages beyond this limit will be recreated from the adapter when needed.You should keep this limit low, especially if your pages have
complex layouts. This setting defaults to 1.
大概意思就是说:
设置当前page左右两侧应该被保持的page数量,超过这个限制,page会被销毁重建(只是销毁视图),onDestroy-onCreateView,但不会执行onDestroy。尽量维持这个值小,特别是有复杂布局的时候,因为如果这个值很大,就会占用很多内存,如果只有3-4page的话,可以全部保持active,可以保持page切换的顺滑
这下很好理解了,默认情况下是1,所以当前fragment左右两侧,就会被保持1页pager,所以上述切换到fragment2并不会销毁任何视图,但是到fragment1,3会。这里注意这个值,是左右两侧能够维持的page,所以如果setOffscreenPageLimit(2),那么就不会频繁的销毁了
destroyItem()
//super.destroyItem(container, position, object);& 注释掉调用父类方法即可
2.& 取消预加载,可以fragment的setUserVisibleHint实现,具体实现参考代码示例
setUserVisibleHint
//Set a hint to the system about whether this fragment's UI is currently visible to the user. This hint defaults to true and is persistent across fragment instance state save and restore.An app may set this to false to indicate that the fragment's UI is
scrolled out of visibility or is otherwise not directly visible to the user. This may be used by the system to prioritize operations such as fragment lifecycle updates or loader ordering behavior.
大概意思就是:fragment对用户可见,isVisibleToUser为true,不可见isVisibleToUser为false。对应于viewpager,当前pager,非当前pager
package com.example.
public class MainActivity extends FragmentActivity implements OnClickListener {
private TextView mFstB
private TextView mSndB
private TextView mThdB
private ViewPager mViewP
private ListFragmentPagerAdapter mPagerA
private List&Fragment& mFragments = new ArrayList&Fragment&();
private final int FIRST_FRAGMENT = 0;
private final int SECOND_FRAGMENT = 1;
private final int THIRD_FRAGMENT = 2;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initItem();
initViewPager();
* 初始化按钮
private void initItem() {
mFstBtn = (TextView) findViewById(R.id.first_item);
mFstBtn.setActivated(true);
mFstBtn.setOnClickListener(this);
mSndBtn = (TextView) findViewById(R.id.second_item);
mSndBtn.setOnClickListener(this);
mThdBtn = (TextView) findViewById(R.id.third_item);
mThdBtn.setOnClickListener(this);
* 初始化ViewPager控件
private void initViewPager() {
mViewPager = (ViewPager) findViewById(R.id.id_vp_viewpager);
//Set the number of pages that should be retained to either side of the current page in the view hierarchy in an idle state.
//Pages beyond this limit will be recreated from the adapter when needed.
//You should keep this limit low, especially if your pages have complex layouts. This setting defaults to 1.
mViewPager.setOffscreenPageLimit(2);
//3个page,所以第一个page启动的时候,右侧的page会加载,中间第二个page选中的时候,不会做任何事情,因为左右两侧现在各有一个,第三个page选中的时候,销毁第一个page的视图,
//因为现在page3左侧有2个page了,必须销毁远的那个
//意思就是说设置当前page左右两侧应该被保持的page数量,超过这个限制,page会被销毁重建(只是销毁视图),onDestroy-onCreateView,但不会执行onDestroy
//尽量维持这个值小,特别是有复杂布局的时候,因为如果这个值很大,就会占用很多内存,如果只有3-4page的话,可以全部保持active,可以保持page切换的顺滑
//添加Fragment
mFragments.add(CustomListFragment.newInstance(FIRST_FRAGMENT));
mFragments.add(CustomListFragment.newInstance(SECOND_FRAGMENT));
mFragments.add(CustomListFragment.newInstance(THIRD_FRAGMENT));
mPagerAdapter = new ListFragmentPagerAdapter(getSupportFragmentManager(), mFragments);
mViewPager.setAdapter(mPagerAdapter);
mViewPager.addOnPageChangeListener(onPageChangeListener);
private OnPageChangeListener onPageChangeListener = new OnPageChangeListener() {
public void onPageSelected(int position) {
//根据用户选中的按钮修改按钮样式
activeItem(position);
public void onPageScrolled(int arg0, float arg1, int arg2) {
public void onPageScrollStateChanged(int arg0) {
public void onClick(View v) {
switch (v.getId()) {
case R.id.first_item:
activeItem(0);
mViewPager.setCurrentItem(FIRST_FRAGMENT);
case R.id.second_item:
activeItem(1);
mViewPager.setCurrentItem(SECOND_FRAGMENT);
case R.id.third_item:
activeItem(2);
mViewPager.setCurrentItem(THIRD_FRAGMENT);
private void activeItem(int item) {
switch (item) {
mFstBtn.setActivated(true);
mSndBtn.setActivated(false);
mThdBtn.setActivated(false);
mFstBtn.setActivated(false);
mSndBtn.setActivated(true);
mThdBtn.setActivated(false);
mFstBtn.setActivated(false);
mSndBtn.setActivated(false);
mThdBtn.setActivated(true);
&LinearLayout xmlns:android=&/apk/res/android&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:orientation=&vertical& &
&LinearLayout
android:layout_width=&match_parent&
android:layout_height=&45dp&
android:layout_margin=&@dimen/padding_10&
android:background=&@drawable/tab_corner_btn_all_selector&
android:orientation=&horizontal& &
android:id=&@+id/first_item&
android:layout_width=&0dp&
android:layout_height=&match_parent&
android:layout_weight=&1&
android:background=&@drawable/tab_corner_btn_left_selector&
android:gravity=&center&
android:text=&第一个&
android:textColor=&@color/black&
android:textSize=&15sp& /&
android:layout_width=&@dimen/line&
android:layout_height=&match_parent&
android:background=&@color/orange& /&
android:id=&@+id/second_item&
android:layout_width=&0dp&
android:layout_height=&match_parent&
android:layout_weight=&1&
android:background=&@drawable/tab_corner_btn_center_selector&
android:gravity=&center&
android:text=&第二个&
android:textColor=&@color/black&
android:textSize=&15sp& /&
android:layout_width=&@dimen/line&
android:layout_height=&match_parent&
android:background=&@color/orange& /&
android:id=&@+id/third_item&
android:layout_width=&0dp&
android:layout_height=&match_parent&
android:layout_weight=&1&
android:background=&@drawable/tab_corner_btn_right_selector&
android:gravity=&center&
android:text=&第三个&
android:textColor=&@color/black&
android:textSize=&15sp& /&
&/LinearLayout&
&android.support.v4.view.ViewPager
android:id=&@+id/id_vp_viewpager&
android:layout_width=&match_parent&
android:layout_height=&match_parent& /&
&/LinearLayout&
基类的Fragment
package com.example.
import android.support.v4.app.F
public abstract class BaseFragment extends Fragment {
/** Fragment当前状态是否可见 */
protected boolean isV
//setUserVisibleHint
adapter中的每个fragment切换的时候都会被调用,如果是切换到当前页,那么isVisibleToUser==true,否则为false
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if(isVisibleToUser) {
isVisible =
onVisible();
isVisible =
onInvisible();
protected void onVisible() {
lazyLoad();
protected void onInvisible() {
* 延迟加载
* 子类必须重写此方法
protected abstract void lazyLoad();
具体fragment
package com.example.
public class CustomListFragment extends BaseFragment {
private static final String FRAGMENT_INDEX = &fragment_index&;
private final int FIRST_FRAGMENT = 0;
private final int SECOND_FRAGMENT = 1;
private final int THIRD_FRAGMENT = 2;
private TextView contentT
private ProgressBar progressB
private int mCurIndex = -1;
* 标志位,标志已经初始化完成
private boolean isP
* 是否已被加载过一次,第二次就不再去请求数据了
private boolean mHasLoadedO
* 创建新实例
* @param index
public static CustomListFragment newInstance(int index) {
Bundle bundle = new Bundle();
bundle.putInt(FRAGMENT_INDEX, index);
CustomListFragment fragment = new CustomListFragment();
fragment.setArguments(bundle);
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
context = getActivity();
Bundle bundle = getArguments();
if (bundle != null) {
mCurIndex = bundle.getInt(FRAGMENT_INDEX);
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment, container, false);
contentText = (TextView) view.findViewById(R.id.content);
progressBar = (ProgressBar) view.findViewById(R.id.progressbar);
isPrepared =
lazyLoad();
protected void lazyLoad() {
if (!isPrepared || !isVisible || mHasLoadedOnce) {
new AsyncTask&Void, Void, Boolean&() {
protected void onPreExecute() {
super.onPreExecute();
progressBar.setVisibility(View.VISIBLE);
protected Boolean doInBackground(Void... params) {
Thread.sleep(2000);
//在这里添加调用接口获取数据的代码
//doSomething()
} catch (Exception e) {
e.printStackTrace();
protected void onPostExecute(Boolean isSuccess) {
if (isSuccess) {
// 加载成功
setView();
mHasLoadedOnce =
// 加载失败
progressBar.setVisibility(View.GONE);
}.execute();
private void setView() {
// 根据索引加载不同视图
switch (mCurIndex) {
case FIRST_FRAGMENT:
contentText.setText(&第一个&);
case SECOND_FRAGMENT:
contentText.setText(&第二个&);
case THIRD_FRAGMENT:
contentText.setText(&第三个&);
public void onDestroyView() {
super.onDestroyView();
Log.d(&LiaBin&, &onDestroyView: curIndex=& + mCurIndex);
public void onDestroy() {
super.onDestroy();
Log.d(&LiaBin&, &onDestroy: curIndex=& + mCurIndex);
FragmentPagerAdapter实现
package com.example.
public class ListFragmentPagerAdapter extends FragmentPagerAdapter {
private static final int TAB_COUNT = 3;
private List&Fragment& mFragmentL
public ListFragmentPagerAdapter(FragmentManager fm, List&Fragment& fragments) {
super(fm);
this.mFragmentList =
public Fragment getItem(int position) {
return (mFragmentList == null || mFragmentList.size() & TAB_COUNT) ? null : mFragmentList.get(position);
public int getCount() {
return mFragmentList == null ? 0 : mFragmentList.size();
//Remove a page for the given position. The adapter is responsible for removing the view from its container
//防止重新销毁视图
public void destroyItem(ViewGroup container, int position, Object object) {
//如果注释这行,那么不管怎么切换,page都不会被销毁
super.destroyItem(container, position, object);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:29557次
积分:1071
积分:1071
排名:千里之外
原创:76篇
转载:14篇
评论:11条
(2)(19)(15)(17)(13)(19)(1)(6)【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问- android开发教程 黑帽网
&>&&>&&>& > 正文
【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问
& & & & 【ViewPager+Fragment】ViewPager中切换界面Fragment被销毁的问题分析ViewPager中切换界面Fragment被销毁的问题分析& & 1、使用场景& & ViewPager+Fragment实现界面切换,界面数量>=3& & & & 2、Fragment生命周期以及与Activity生命周期对比& & & & 3、问题描述& & 按上图所说,只有当Fragment所Attached的Activity执行destroy的时候才会调用onDesyView方法,然而现实是:& & 当界面由2切换到1的时候,3界面对应的Fragment实际上走了如下流程:& & 1 --&onPause2 --&onStop3 --&onDestroyView& & & & 再由1切换回2或者3时,3界面对应的Fragment的执行流程:& & 1 --&onCreateView2 --&onStart3 --&onResume& & 可见,界面3对应的Fragment被销毁并重新创建。& & 4、原因分析& & ViewPager的默认加载方式是缓存当前界面前后相邻的两个界面,即最多共缓存包括当前界面在内的三个界面信息。当滑动切换界面的时候,非相邻界面信息将被释放。& & 界面2是当前界面,界面1和3是缓存界面,当切换到1时,界面2仍缓存,界面3被销毁释放,于是便有了onDestroyView的调用。& & 由1切换到2或3时,界面3又被重新创建,于是走了onCreateView流程。5、解决方案方案一:设置ViewPager的缓存界面数& & 此方案适用于界面数较少的情况,避免缓存界面太多导致内存吃紧。& & 方法:& & mPager .setOffscreenPageLimit(2);& & 参数:int limit&&&&-&&&&缓存当前界面每一侧的界面数& & 以上述为例,当前界面为1,limit = 2,表示缓存2、3两个界面。如此便避免了界面3被销毁。方案二:保存状态并恢复& & 此方案适用于可用界面信息可由状态保存和恢复实现的情况。& & 在onDestroyView方法内保存相关信息,在onCreateView方法内恢复信息设置。方案三(推荐):复用Fragment的RootView& & 此方案适用通用场景,推荐使用。& & 步骤1:在onDestroyView方法内把Fragment的RootView从ViewPager中remove1 @Override2 public void onDestroyView() {3
LogUtils.d(TAG , "--&onDestroyView");4
super .onDestroyView();5
if (null != FragmentView) {6
((ViewGroup) mFragmentView.getParent()).removeView(mFragmentView);7
}8 }& & 步骤2:在onCreateView方法内复用RootView1 @Override 2 public View onCreateView(LayoutInflater inflater, ViewGroup container, 3
Bundle savedInstanceState) { 4
LogUtils.d (TAG, "--&onCreateView"); 5
if (null == mFragmentView) { 6
mFragmentView = inflater.inflate(R.layout.fragment, container, false); 7
mListView = (ListView) mFragmentView .findViewById(R.id.mm_listview); 8
mListView.setAdapter(mAdapter); 9
mPbar = (ProgressBar) mFragmentView.findViewById(R.id.pbar_mm_loading);10
mPbar.setVisibility(View.VISIBLE);11
return mFragmentV14 }& & 作者:Nodin& & 出处:/monodin/
您对本文章有什么意见或着疑问吗?请到您的关注和建议是我们前行的参考和动力&&为了账号安全,请及时绑定邮箱和手机
Fragment+ViewPager+Fragment
该怎么在Fragment中使用ViewPager
并且ViewPager的三个Tab使用3个Fragmengt
也就是 Fragment中嵌套ViewPager
ViewPager嵌套Fragment
Copyright (C)
All Rights Reserved | 京ICP备 号-2| 漏洞检测 |
| 隐藏捆绑 |
正确的在ViewPager中使用Bitmap图像
在实现image gallery的详情查看时使用swipe view模式是很好的选择,你可以使用ViewPager和对应的PagerAdapter来实现这个模式。不过对于adapter你还有更好的选择:FragmentStatePagerAdapter,当屏幕关闭的时候这个子类可以自动的销毁和保存ViewPager的Fragmen
在实现image gallery的详情查看时swipe view模式是很好的选择,你可以和对应的PagerAdapter来实现这个模式。不过对于adapter你还有更好的选择:FragmentStatePagerAdapter,当屏幕关闭的时候这个子类可以自动的销毁和保存的Fragments状态,以节省内存。
注意:如果你只需要使用很少的图片,并确定其不会超出程序内存的限制的话,使用PagerAdapter或者FragmentPagerAdapter对于你来说是最适合的。
下面是一个ViewPager的实现,他里面包含了数个ImageView。在main activity中使用ViewPager和adapter:
public class ImageDetailActivity extends FragmentActivity {
& & public static final String EXTRA_IMAGE = &extra_image&;
& & private ImagePagerAdapter mA
& & private ViewPager mP
& & // A static dataset to back the ViewPager adapter
& & public final static Integer[] imageResIds = new Integer[] {
& & & & & & R.drawable.sample_image_1, R.drawable.sample_image_2, R.drawable.sample_image_3,
& & & & & & R.drawable.sample_image_4, R.drawable.sample_image_5, R.drawable.sample_image_6,
& & & & & & R.drawable.sample_image_7, R.drawable.sample_image_8, R.drawable.sample_image_9};
& & @Override
& & public void onCreate(Bundle savedInstanceState) {
& & & & super.onCreate(savedInstanceState);
& & & & setContentView(R.layout.image_detail_pager); // Contains just a ViewPager
& & & & mAdapter = new ImagePagerAdapter(getSupportFragmentManager(), imageResIds.length);
& & & & mPager = (ViewPager) findViewById(R.id.pager);
& & & & mPager.setAdapter(mAdapter);
& & public static class ImagePagerAdapter extends FragmentStatePagerAdapter {
& & & & private final int mS
& & & & public ImagePagerAdapter(FragmentManager fm, int size) {
& & & & & & super(fm);
& & & & & & mSize =
& & & & @Override
& & & & public int getCount() {
& & & & & & return mS
& & & & @Override
& & & & public Fragment getItem(int position) {
& & & & & & return ImageDetailFragment.newInstance(position);
下面是使用Fragment和ImageView的一个实现,看上去是十分合理的,你能发现它的缺点吗?并且如何进行改进?
public class ImageDetailFragment extends Fragment {
& & private static final String IMAGE_DATA_EXTRA = &resId&;
& & private int mImageN
& & private ImageView mImageV
& & static ImageDetailFragment newInstance(int imageNum) {
& & & & final ImageDetailFragment f = new ImageDetailFragment();
& & & & final Bundle args = new Bundle();
& & & & args.putInt(IMAGE_DATA_EXTRA, imageNum);
& & & & f.setArguments(args);
& & // Empty constructor, required as per Fragment docs
& & public ImageDetailFragment() {}
& & @Override
& & public void onCreate(Bundle savedInstanceState) {
& & & & super.onCreate(savedInstanceState);
& & & & mImageNum = getArguments() != null ? getArguments().getInt(IMAGE_DATA_EXTRA) : -1;
& & @Override
& & public View onCreateView(LayoutInflater inflater, ViewGroup container,
& & & & & & Bundle savedInstanceState) {
& & & & // image_detail_fragment.xml contains just an ImageView
& & & & final View v = inflater.inflate(R.layout.image_detail_fragment, container, false);
& & & & mImageView = (ImageView) v.findViewById(R.id.imageView);
& & @Override
& & public void onActivityCreated(Bundle savedInstanceState) {
& & & & super.onActivityCreated(savedInstanceState);
& & & & final int resId = ImageDetailActivity.imageResIds[mImageNum];
& & & & mImageView.setImageResource(resId); // Load image into ImageView
希望你已经注意到了这个问题:所有的图片都是在UI线程中处理的,这样将导致程序挂掉,强制退出。这时需要使用AsyncTask(在&Processing s Off the UI Thread&这一篇文章中介绍过的)来处理,直接将图片的加载和处理放在后台线程中去做。
public class ImageDetailActivity extends FragmentActivity {
& & public void load(int resId, ImageView imageView) {
& & & & mImageView.setImageResource(R.drawable.image_placeholder);
& & & & BitmapWorkerTask task = new BitmapWorkerTask(mImageView);
& & & & task.execute(resId);
& & ... // include BitmapWorkerTask class
public class ImageDetailFragment extends Fragment {
& & @Override
& & public void onActivityCreated(Bundle savedInstanceState) {
& & & & super.onActivityCreated(savedInstanceState);
& & & & if (ImageDetailActivity.class.isInstance(getActivity())) {
& & & & & & final int resId = ImageDetailActivity.imageResIds[mImageNum];
& & & & & & // Call out to ImageDetailActivity to load the bitmap in a background thread
& & & & & & ((ImageDetailActivity) getActivity()).loadBitmap(resId, mImageView);
(责任编辑:幽灵学院)
------分隔线----------------------------
今天有空复习了一下Android中AIDL的使用,由于平时开发中使...
在之前的文章深入探究了Handler,我们知道了Android的消息机...
?之前一段时间,我都在研究Android自定义View的相关知识,随...
什么是ViewPager,刚一听到这个词,我们可能感觉很奇怪,但...
Only the original thread that created a view hierarchy c...
在这里写出我们项目中常用的两种弹窗方式,底部弹窗以及中间...
工作日:9:00-21:00
周 六:9:00-18:00
&&扫一扫关注幽灵学院内容字号:
段落设置:
字体设置:
利用FragmentTabHost和ViewPager实现类微信界面切换效果
生活本来就不容易,而我们的不努力只会让生活变得更加无赖
今天学习了如何利用FragmentTabHost以及ViewPager的知识点,简单写了个demo实现界面滑动点击切换的效果.现在市面上大部分的APP都有这种类似的功能,如微信,简书等等,相信实现方法略同.因此便写一篇日记记录该功能的实现.demo部分截图如下:
FragmentTabHost的用法(要点)
Activity必须继承自FragmentActivity(AppCompatActivity为其子类).
使用setup()方法绑定Fragmenrt,
使用TabHost.TabSpec 设置spec,spec则需要indicator,indicator则需要View填充.
实现setOnTabChangedListener接口来对Viewpager的滑动进行监听
ViewPager的用法(要点)
1.Viewpager被添加在v4包当中,官方推荐结合Fragment使用以实现滑动切换的效果,因此需要一个适配器Adapter继承FragmentPagerAdapter装载Fragment.
2.实现addOnPageChangeListener接口来对FragmentTabHost的点击的监听.
由上可知,我们需要写几个xml文件显示相关::
activity_main.xml
xmlns:android=&/apk/res/android&
android:orientation=&vertical&
android:layout_width=&match_parent&
android:layout_height=&match_parent&&
android:layout_weight=&1&
android:layout_width=&wrap_content&
android:layout_height=&0dp&
android:id=&@+id/view_pager&&
android:layout_width=&match_parent&
android:layout_height=&wrap_content&
android:id=&@android:id/tabhost&
android:background=&@android:color/white&
android:layout_marginTop=&2dp&
android:layout_marginBottom=&2dp&&
android:layout_width=&0dp&
android:id=&@android:id/tabcontent&
android:layout_height=&0dp&
android:layout_weight=&0&&
这里需要注意的地方是,在FragmentTabHost里面的FrameLayout的id必须为&@android:id/tabcontent
给indicator填充的item_view.xml
xmlns:android=&/apk/res/android&
android:orientation=&vertical&
android:layout_width=&match_parent&
android:layout_height=&match_parent&
android:layout_marginTop=&10dp&
android:layout_marginBottom=&10dp&&
android:id=&@+id/imageview&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_gravity=&center&
android:padding=&3dp&&
android:id=&@+id/tabtextview&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:textSize=&10sp&
android:layout_gravity=&center&
android:textColor=&@color/tab_text&&
fragment1.xml(这里需要四个,但全部相同,先贴出一个)
xmlns:android=&/apk/res/android&
android:orientation=&vertical&
android:layout_width=&match_parent&
android:layout_height=&match_parent&&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:textAppearance=&?android:attr/textAppearanceLarge&
android:text=&这是第一个Fragment&
android:id=&@+id/textView& /&
ViewPager的适配器以及监听接口的实现:
MyAdapter.java
public class MyAdapter extends FragmentPagerAdapter{
private List&Fragment&
public MyAdapter(FragmentManager fm,List&Fragment& list) {
super(fm);
this.views =
public Fragment getItem(int position) {
return views.get(position);
public int getCount() {
return views.size();
MyPageChangeListener.java
public class MyPageChangeListener implements ViewPager.OnPageChangeListener {
private FragmentTabHost tabH
public MyPageChangeListener(FragmentTabHost tabHost) {
this.tabHost = tabH
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
public void onPageSelected(int position) {
tabHost.setCurrentTab(position);
public void onPageScrollStateChanged(int state) {
Fragment(相同只贴一个)
Fragment1.java
public class Fragment1 extends Fragment{
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment1,null);
注意Fragment必须继承自v4包的.
因有多个资源需配置,所以进行简单的封装
public class Tab {
private int
private int
private Class F
public Tab(int title, int img, Class fragment) {
this.title =
this.img =
Fragment =
public int getTitle() {
public void setTitle(int title) {
this.title =
public int getImg() {
public void setImg(int img) {
this.img =
public Class getFragment() {
public void setFragment(Class fragment) {
Fragment =
MainActivity.java
import android.os.B
import android.support.annotation.N
import android.support.v4.app.F
import android.support.v4.app.FragmentTabH
import android.support.v4.view.ViewP
import android.support.v7.app.AppCompatA
import android.view.LayoutI
import android.view.V
import android.widget.ImageV
import android.widget.LinearL
import android.widget.TabH
import android.widget.TextV
import java.util.ArrayL
import java.util.L
public class TabHost_Aty extends AppCompatActivity {
private FragmentTabHost tabH
private View view = null;
private LayoutInflater I
private List&Tab& list = new ArrayList&&(4);
private ViewPager viewP
private List&Fragment& FragmentList = new ArrayList&&(4);
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tabhost);
Inflater = LayoutInflater.from(this);
initTab();
private void initTab() {
tabHost = (FragmentTabHost) findViewById(android.R.id.tabhost);
tabHost.setup(this,getSupportFragmentManager(),R.id.view_pager);
Tab tabmain = new Tab(R.string.main, R.drawable.btn_notifi, Fragment1.class);
Tab tabcontact = new Tab(R.string.contact, R.drawable.btn_contact, Fragment2.class);
Tab tabmine = new Tab(R.string.setting, R.drawable.btn_mine, Fragment3.class);
Tab tabfound = new Tab(R.string.find, R.drawable.btn_found, Fragment4.class);
list.add(tabmain);
list.add(tabcontact);
list.add(tabmine);
list.add(tabfound);
for (Tab tab : list) {
TabHost.TabSpec spec= tabHost.newTabSpec(getString(tab.getTitle()))
.setIndicator(getItemView(tab));
tabHost.addTab(spec,tab.getFragment(),null);
tabHost.getTabWidget().setShowDividers(LinearLayout.SHOW_DIVIDER_NONE);
initFragment();
* 初始化ViewPager
private void initFragment() {
FragmentList.add(new Fragment1());
FragmentList.add(new Fragment2());
FragmentList.add(new Fragment3());
FragmentList.add(new Fragment4());
viewPager = (ViewPager) findViewById(R.id.view_pager);
viewPager.setAdapter(new MyAdapter(getSupportFragmentManager(),FragmentList));
viewPager.addOnPageChangeListener(new MyPageChangeListener(tabHost));
tabHost.setOnTabChangedListener(new TabHost.OnTabChangeListener() {
public void onTabChanged(String tabId) {
int position
=tabHost.getCurrentTab();
viewPager.setCurrentItem(position);
private View getItemView(Tab tab) {
view = Inflater.inflate(R.layout.item_view, null);
ImageView img = (ImageView) view.findViewById(R.id.imageview);
TextView textview = (TextView) view.findViewById(R.id.tabtextview);
img.setImageResource(tab.getImg());
textview.setText(tab.getTitle());
分享给小伙伴们:
本类最热新闻
48小时最热
0102030405060708910
CopyRight © 2015- , All Rights Reserved.
清屏网 版权所有 豫ICP备号

我要回帖

更多关于 viewpager点击切换 的文章

 

随机推荐