FragmentViewPagerAdapter中使用FragmentTabhost 重新生成view解决办法

来源:互联网 发布:matlab怎么编程言 编辑:程序博客网 时间:2024/06/15 04:30

引入FragmentTabhost后会再每次切换的时候都重新去生成view,但是一般使用过程不希望每次都加载view影响用户体验,目前发现一种解决办法就是在fragment中缓存view

1.fragment1.java

public class Fragment1 extends Fragment {
TextView msg;
private Activity mContext;
private Context context;
private static View rootView;
public Fragment1() {
// TODO Auto-generated constructor stub
}


public Fragment1(Activity context) {
this.mContext = context;
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(rootView==null){
rootView = inflater.inflate(R.layout.fragment1, null);
context = rootView.getContext();
msg = (TextView) rootView.findViewById(R.id.msg);
Log.e("tag","onCreateView Fragment1");
}

ViewGroup parent = (ViewGroup) rootView.getParent();  
if (parent!=null){
parent.removeView(rootView);  
}

return rootView;

}

2.fragement2.java

public class Fragment2 extends Fragment {
TextView msg;
    private Activity mContext;
    private View rootView;
private Context context;

public Fragment2() {
// TODO Auto-generated constructor stub
}


public Fragment2(Activity context) {
this.mContext = context;
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if(rootView==null){
rootView = inflater.inflate(R.layout.fragment2, null);
context = rootView.getContext();
msg = (TextView) rootView.findViewById(R.id.msg);
Log.e("tag","onCreateView Fragment2");
}

ViewGroup parent = (ViewGroup) rootView.getParent();  
if (parent!=null){
parent.removeView(rootView);  
}
return rootView;
}


public void setMsg(String text) {
msg.setText(text);
}


3.fragment3.java

public class Fragment3 extends Fragment {
TextView msg;
    private Activity mContext;
private View rootView;
private Context context;

public Fragment3() {
}


public Fragment3(Activity context) {
this.mContext = context;
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {

if(rootView==null){
rootView = inflater.inflate(R.layout.fragment3, null);
context = rootView.getContext();
msg = (TextView) rootView.findViewById(R.id.msg);
Log.e("tag","onCreateView Fragment3");
}

ViewGroup parent = (ViewGroup) rootView.getParent();  
if (parent!=null){
parent.removeView(rootView);  
}
return rootView;
}


public void setMsg(String text) {
msg.setText(text);
}


4.mainactivity.java

package com.example.fragmenttabhostviewpager;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;


import com.application.SysApplication;
import com.example.widgets.FragmentViewPagerAdapter;


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.FragmentTabHost;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.DisplayMetrics;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.TabHost.OnTabChangeListener;
import android.widget.TabHost.TabSpec;
import android.widget.ImageView;


public class MainActivity extends FragmentActivity {
private RadioGroup rg;
private RadioButton firstBtn;
private RadioButton secondBtn;
private RadioButton thirdBtn;
private FragmentTabHost mFragmentTabhost;
public static final String SHOW_OF_FIRST_TAG = "first";
public static final String SHOW_OF_SECOND_TAG = "second";
public static final String SHOW_OF_THIRD_TAG = "third";
private int SCREEN_WIDTH;
private float currentX;// 当前X坐标
private float preX;// 前一操作的X坐标
private ImageView mRedlineIV;
private List<Fragment> list = new ArrayList<Fragment>();
private ViewPager mViewPager;
private HashMap<Integer, Fragment> fragments = new HashMap<Integer, Fragment>();


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
SCREEN_WIDTH = metrics.widthPixels;
setContentView(R.layout.activity_main);

SysApplication app = (SysApplication) getApplication();
        app.addActivity(this);


mFragmentTabhost = (FragmentTabHost) findViewById(android.R.id.tabhost);
rg = (RadioGroup) findViewById(R.id.tab_rg_menu);
firstBtn = (RadioButton) findViewById(R.id.tab_rb_1);
secondBtn = (RadioButton) findViewById(R.id.tab_rb_2);
thirdBtn = (RadioButton) findViewById(R.id.tab_rb_3);
mViewPager = (ViewPager) findViewById(R.id.pager);
mRedlineIV = (ImageView) findViewById(R.id.tab_menu_red_line);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
SCREEN_WIDTH / 3, LinearLayout.LayoutParams.WRAP_CONTENT);
mRedlineIV.setLayoutParams(params);
mRedlineIV.setImageResource(R.drawable.ic_launcher);
mFragmentTabhost.setup(this, getSupportFragmentManager(), R.id.pager);


TabSpec tabSpec0 = mFragmentTabhost.newTabSpec(SHOW_OF_FIRST_TAG)
.setIndicator("0");
TabSpec tabSpec1 = mFragmentTabhost.newTabSpec(SHOW_OF_SECOND_TAG)
.setIndicator("1");
TabSpec tabSpec2 = mFragmentTabhost.newTabSpec(SHOW_OF_THIRD_TAG)
.setIndicator("2");


mFragmentTabhost.addTab(tabSpec0, Fragment1.class, null);
mFragmentTabhost.addTab(tabSpec1, Fragment2.class, null);
mFragmentTabhost.addTab(tabSpec2, Fragment3.class, null);


rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {


@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// TODO Auto-generated method stub
switch (checkedId) {
case R.id.tab_rb_1:
preX = currentX;
currentX = 0;
mFragmentTabhost.setCurrentTabByTag(SHOW_OF_FIRST_TAG);
break;
case R.id.tab_rb_2:
preX = currentX;
currentX = SCREEN_WIDTH * 1 / 3;
mFragmentTabhost.setCurrentTabByTag(SHOW_OF_SECOND_TAG);
break;
case R.id.tab_rb_3:
preX = currentX;
currentX = SCREEN_WIDTH * 2 / 3;
mFragmentTabhost.setCurrentTabByTag(SHOW_OF_THIRD_TAG);
break;


default:
break;
}
Animation translateAnimation = new TranslateAnimation(preX,
currentX, 0, 0);
translateAnimation.setFillAfter(true);
translateAnimation.setDuration(1000);
mRedlineIV.setAnimation(translateAnimation);
}
});


mFragmentTabhost.setOnTabChangedListener(new OnTabChangeListener() {


@Override
public void onTabChanged(String tabId) {
// TODO Auto-generated method stub
int position = mFragmentTabhost.getCurrentTab();
mViewPager.setCurrentItem(position);
}
});


mFragmentTabhost.setCurrentTab(0);
initFragment();
mViewPager.setAdapter(new FragmentViewPagerAdapter(getSupportFragmentManager(),fragments));
mViewPager.setOnPageChangeListener(new ViewPagerListener());
mViewPager.setCurrentItem(0);
}

private void initFragment(){
        fragments.put(0, new Fragment1(this));
        fragments.put(1, new Fragment2(this));
        fragments.put(2, new Fragment3(this));
    }




class ViewPagerListener implements OnPageChangeListener {
@Override
public void onPageScrollStateChanged(int arg0) {


}


@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {


}


@Override
public void onPageSelected(int index) {
if (index == 0) {
firstBtn.setChecked(true);
} else if (index == 1) {
secondBtn.setChecked(true);
} else if (index == 2) {
thirdBtn.setChecked(true);
}
mFragmentTabhost.setCurrentTab(index);
mViewPager.setCurrentItem(index);
}
}
}

0 0