tab式的fragment 用replace切换fragment时,数据的状态如何保存呢?
以下代码供参考:
BaseFragment:
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* @ClassName: BaseFragment
* @Description: 基础的Fragment
* @author zrspring
* @date 2014-5-24 下午3:52:30
* @ConputerUserName zrspring
*/
public abstract class BaseFragment extends Fragment {
/**
* @Variables savedBudleData : 用于保存数据的bundle
*/
public Bundle savedBudleData = null;
public String test = "";
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
bindingListener(activity);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Bundle info = getArguments();
findBundleData(info);
LoadData();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View fragmentView = inflater.inflate(setFragmentViewLayout(), container,false);
iniView(fragmentView);
if(savedInstanceState != null && savedBudleData == null) {
savedBudleData = savedInstanceState.getBundle(getSavaDataBudleKeyName());
System.out.println("savedInstanceState != null && savedBudleData == null");
}
if(savedBudleData != null) {
readDataFromBudle(savedBudleData);
System.out.println("savedBudleData != null");
}
//完成以后重置用于保存数据的bundle 对象
savedBudleData = null;
System.out.println("BaseFragment onCreateView");
return fragmentView;
}
/**
* @Title: getSavaDataBudleKeyName
* @Description: 给储存数据的Bundle的Key名
* @return
* @throws
*/
public abstract String getSavaDataBudleKeyName();
/**
* @Title: resetDataToView
* @Description: 如果View被从新加载,在那么就从savedInstanceState中取出指定的 bundle对象所保数据的,交给具体的实现类处理,需要检查是否为空
* @param savedInstanceState
* @throws
*/
public abstract void readDataFromBudle( Bundle dataBundle);
/**
* @Title: needdSaveData
* @Description: 将需要保存的数据,在此方法中去实现
* @return 返回一个已经储存数据的Bundle
* @throws
*/
public abstract Bundle needdSaveData();
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBundle(getSavaDataBudleKeyName(), (savedBudleData != null) ? savedBudleData : needdSaveData());
System.out.println("BaseFragment onSaveInstanceState ");
}
@Override
public void onDestroyView() {
super.onDestroyView();
savedBudleData = needdSaveData();
System.out.println("BaseFragment onDestroyView ");
}
@Override
public void onDestroy() {
super.onDestroy();
cleanMenory();
System.out.println("BaseFragment onDestroy ");
}
/**
* @Title: bindingListener
* @Description: 绑定和Activity的接口
* @param activity
* @return
* @throws
*/
public abstract int bindingListener(Activity activity);
/**
* @Title: setFragmentView
* @Description: 设置布局
* @return
* @throws
*/
public abstract int setFragmentViewLayout();
/**
* @Title: iniView
* @Description: 初始化布局
* @param fragmentView
* @throws
*/
public abstract void iniView(View fragmentView);
/**
* @Title: findBundleData
* @Description: 获取activity传过来的数据
* @param info
* @throws
*/
public abstract void findBundleData(Bundle info);
/**
* @Title: LoadData
* @Description: 加载数据,本地,或者服务器
* @throws
*/
public abstract void LoadData();
/**
* @Title: cleanMenory
* @Description: 清空内存
* @throws
*/
public abstract void cleanMenory();
}
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
public class FragmentA extends BaseFragment{
private EditText etA;
public List<String> list = new ArrayList<String>();;
ArrayAdapter<String> itemsAdapter;
ListView listView;
@Override
public String getSavaDataBudleKeyName() {
return "fragment_a";
}
@Override
public void readDataFromBudle(Bundle dataBundle) {
String b = dataBundle.getString("fbAdit");
etA.setText(b);
list = dataBundle.getStringArrayList("list");
System.out.println("AAAAAAAAA size = "+list.size()+" fragmentName ="+dataBundle.getString("fragmentName")+" "+this.getClass().hashCode());
if(list.size() > 0){
itemsAdapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, list);
listView.setAdapter(itemsAdapter);
}else{
list = new ArrayList<String>();
for(int i = 0;i<6;i++){
list.add("Sunny "+i);
}
itemsAdapter = new ArrayAdapter<String>(this.getActivity(), android.R.layout.simple_list_item_1, list);
listView.setAdapter(itemsAdapter);
}
}
@Override
public Bundle needdSaveData() {
Bundle b = new Bundle();
b.putString("fbAdit", etA.getText().toString().trim());
b.putString("fragmentName", "A");
list.add("needdSaveData");
b.putStringArrayList("list", (ArrayList<String>) list);
return b;
}
@Override
public int bindingListener(Activity activity) {
return 0;
}
@Override
public int setFragmentViewLayout() {
return R.layout.fragment_a;
}
@Override
public void iniView(View fragmentView) {
etA=(EditText) fragmentView.findViewById(R.id.fragment_a_edit);
listView = (ListView) fragmentView.findViewById(R.id.listView);
etA.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
test = "it is A";
}
});
System.out.println("test = "+test);
}
@Override
public void findBundleData(Bundle info) {
}
@Override
public void LoadData() {
// TODO Auto-generated method stub
}
@Override
public void cleanMenory() {
// TODO Auto-generated method stub
}
}
onSaveInstanceState这个方法是系统内存不够,把fragment销毁的时候才会调用。
fragment切换时不要重新new,系统会自动缓存fragment的数据。但是为了避免fragment被系统回收,还需要在onSaveInstanceState方法实现保存数据的代码。