fragment replace时的状态保存

本文详细介绍了在使用tab式的fragment进行切换时,如何通过保存和恢复数据状态来确保用户体验不受影响。通过BaseFragment基类的实现,展示了如何在onAttach、onActivityCreated、onCreateView、onSaveInstanceState等关键生命周期方法中处理数据的保存与恢复。以FragmentA为例,具体展示了如何在读取和保存数据的同时,避免重复new fragment带来的资源浪费。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
	
}


FragmentA:

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方法实现保存数据的代码。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值