微信支持下面四个Tab滑动,之前做的demo,遇到两个问题,1:Fragment会预加载,2:创建过的Fragment,来回滑动,会销毁重新创建。今天我这个demo,就要解决这两个问题。第一个问题需要导入一个新的V4包,最后我会提供,ViewPage要设置 mViewPager .setOffscreenPageLimit(0);这样的就能解决预加载的问题。第二个问题:我贴上代码:
package com.example.fragmentviewpage; import java.util.ArrayList; import java.util.List; import android.os.Bundle; 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.app.FragmentStatePagerAdapter; import android.support.v4.app.FragmentTransaction; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.Window; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.TextView; public class MainActivity extends FragmentActivity implements OnClickListener { private ViewPager mViewPager; private FragmentStatePagerAdapter mAdapter;//没用到 private List<Fragment> mFragments; private LinearLayout mTabWeixin; private LinearLayout mTabContact; private LinearLayout mTabFind; private LinearLayout mTabSettings; private ImageButton mImgWeixin; private ImageButton mImgContact; private ImageButton mImgFind; private ImageButton mImgSettings; private TextView mWeixintxt; private TextView mContacttxt; private TextView mFindtxt; private TextView mSettingtxt; Fragment mTab01 ; Fragment mTab02 ; Fragment mTab03; Fragment mTab04 ; FragmentTransaction transaction ; private PagerAdapter myPageAdapter; FragmentManager fm ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); initView(); initEvent(); setSelect(0); } private void initEvent() { mTabWeixin.setOnClickListener(this); mTabContact.setOnClickListener(this); mTabFind.setOnClickListener(this); mTabSettings.setOnClickListener(this); } private void initView() { mViewPager = (ViewPager) findViewById(R.id.id_viewpager); mTabWeixin = (LinearLayout) findViewById(R.id.id_tab_weixin); mTabContact = (LinearLayout) findViewById(R.id.id_tab_frd); mTabFind = (LinearLayout) findViewById(R.id.id_tab_address); mTabSettings = (LinearLayout) findViewById(R.id.id_tab_settings); mImgWeixin = (ImageButton) findViewById(R.id.id_tab_weixin_img); mImgContact = (ImageButton) findViewById(R.id.id_tab_frd_img); mImgFind = (ImageButton) findViewById(R.id.id_tab_address_img); mImgSettings = (ImageButton) findViewById(R.id.id_tab_settings_img); mWeixintxt = (TextView)findViewById(R.id.id_tab_weixin_txt); mContacttxt = (TextView) findViewById(R.id.id_tab_frd_txt); mFindtxt = (TextView) findViewById(R.id.id_tab_address_txt); mSettingtxt = (TextView) findViewById(R.id.id_tab_settings_txt); fm = getSupportFragmentManager(); transaction = fm.beginTransaction(); mFragments = new ArrayList<Fragment>(); mTab01 = new MessageFragment(); mTab02 = new ContactFragment(); mTab03 = new FindFragment(); mTab04 = new SettingFragment(); mFragments.add(mTab01); mFragments.add(mTab02); mFragments.add(mTab03); mFragments.add(mTab04); mAdapter = new FragmentStatePagerAdapter(getSupportFragmentManager()) { @Override public int getCount() { return mFragments.size(); } @Override public Fragment getItem(int arg0) { return mFragments.get(arg0); } }; myPageAdapter = new PagerAdapter() { @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(mFragments.get(position).getView()); } @Override public Object instantiateItem(ViewGroup container, int position) { /*View view = mViews.get(position); container.addView(view);*/ Fragment fragment = mFragments.get(position); if(!fragment.isAdded()){ // 如果fragment还没有added FragmentTransaction ft = fm.beginTransaction(); ft.add(fragment, fragment.getClass().getSimpleName()); ft.commit(); /** * 在用FragmentTransaction.commit()方法提交FragmentTransaction对象后 * 会在进程的主线程中,用异步的方式来执行。 * 如果想要立即执行这个等待中的操作,就要调用这个方法(只能在主线程中调用)。 * 要注意的是,所有的回调和相关的行为都会在这个调用中被执行完成,因此要仔细确认这个方法的调用位置。 */ fm.executePendingTransactions(); } if(fragment.getView().getParent() == null){ container.addView(fragment.getView()); // 为viewpager增加布局 } return fragment.getView(); //return view; } @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } @Override public int getCount() { return mFragments.size(); } }; //设置缓存数,我们这里不需要预加载 mViewPager .setOffscreenPageLimit(0); mViewPager.setAdapter(myPageAdapter); mViewPager.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { int currentItem = mViewPager.getCurrentItem(); setTab(currentItem); } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } }); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.id_tab_weixin: setSelect(0); break; case R.id.id_tab_frd: setSelect(1); break; case R.id.id_tab_address: setSelect(2); break; case R.id.id_tab_settings: setSelect(3); break; default: break; } } private void setSelect(int i) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); hideFragment(transaction); switch (i) { case 0: //mImgWeixin.setImageResource(R.drawable.tab_weixin_pressed); break; case 1: //transaction.show(mTab02); mTab02.onResume(); // mImgFrd.setImageResource(R.drawable.tab_find_frd_pressed); break; case 2: //mImgAddress.setImageResource(R.drawable.tab_address_pressed); break; case 3: //mImgSettings.setImageResource(R.drawable.tab_settings_pressed); break; default: break; } setTab(i); mViewPager.setCurrentItem(i); } private void setTab(int i) { resetImgs(); // 设置图片为亮色 // 切换内容区域 setBottom(i); } /** * 切换图片至暗色,不选中 */ private void resetImgs() { mImgWeixin.setSelected(false); mImgContact.setSelected(false); mImgFind.setSelected(false); mImgSettings.setSelected(false); mContacttxt.setSelected(false); mWeixintxt.setSelected(false); mFindtxt.setSelected(false); mSettingtxt.setSelected(false); } //选中 private void setBottom(int position) { switch (position) { case 0: mImgWeixin.setSelected(true); mWeixintxt.setSelected(true); break; case 1: mImgContact.setSelected(true); mContacttxt.setSelected(true); break; case 2: mImgFind.setSelected(true); mFindtxt.setSelected(true); break; case 3: mImgSettings.setSelected(true); mSettingtxt.setSelected(true); break; default: break; } } private void hideFragment(FragmentTransaction transaction) { if (mTab01 != null) { transaction.hide(mTab01); } if (mTab02 != null) { transaction.hide(mTab02); } if (mTab03 != null) { transaction.hide(mTab03); } if (mTab04 != null) { transaction.hide(mTab04); } } }
代码不复杂,很简单。最后附上源码和包。有问题联系我。。