使用Fragment中的onSaveInstanceState进行保存

时间:2016-04-24 09:58:41

标签: android android-fragments screen-rotation

在我的android项目中有一个Fragment,它从另一个类动态获取数据。我将这些数据(一个字符串和Int)保存到bundle中。我希望在屏幕旋转时恢复该包。所以我使用了onSaveInstanceState方法。

在这个片段中,"回复"方法从另一个类获取数据(一个字符串和Int)。我可以在响应方法中在Logcat中打印这些字符串。

片段代码:

     public class Images extends android.support.v4.app.Fragment implements Imageinfo {

private RecyclerView IRecyclerView;
private RecyclerView.Adapter IAdapter;
private RecyclerView.LayoutManager ILayoutManager;

private Context ctx;

private Bundle bundle=new Bundle();

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

    View v =inflater.inflate(R.layout.images, container, false);

    Log.d("ONCREATE VIEW", "TRUE");


    IRecyclerView = (RecyclerView) v.findViewById(R.id.images_tab);
    IRecyclerView.setHasFixedSize(true);
    ILayoutManager = new LinearLayoutManager(getContext());
    IRecyclerView.setLayoutManager(ILayoutManager);

    if(savedInstanceState!=null){
        Log.d("BUNDLE ADDED NOT NULL", String.valueOf(savedInstanceState.size()));
        IAdapter = new ImageAdapter(this.getContext(),((fileselect)getContext()).imageset,bundle);
        IRecyclerView.setAdapter(IAdapter);
    }

    else{
        Log.d("BUNDLE ADDED NULL", "TRUE");
        IAdapter = new ImageAdapter(this.getContext(),((fileselect)getContext()).imageset,null);
        IRecyclerView.setAdapter(IAdapter);
    }

    return v;

}




@Override
public void onSaveInstanceState(Bundle outState) {
    outState=bundle;
    Log.d("SAVING TIME", String.valueOf(outState.size()));
    super.onSaveInstanceState(outState);


}
@Override
public void respond(String str,int type) {


    if(str!=null) {
        if (type == 1) {
            bundle.putString(str, str);
            Log.d("BUNDLE ADDED", bundle.getString(str));
            Log.d("BUNDLE ADDED Size",String.valueOf(bundle.size()));
        } else {

            bundle.remove(str);
            Log.d("BUNDLE REMOVED Size", String.valueOf(bundle.size()));

        }
    }
}
    }

问题:

虽然该方法响应接收数据(一个字符串和Int)并保存到Bundle中,但是当屏幕旋转时,bundle在onSaveInstanceState中变为大小为零。每当我旋转屏幕时,onSaveInstanceState就会被调用,但是这个包的大小为零。随着bundle的大小变为零,我无法恢复这两个字符串。

1 个答案:

答案 0 :(得分:1)

确定问题在于,您尝试引用局部变量,而不是向ip变量添加内容。

关键是outstate类的实例在轮换时会被销毁,您的Images变量也会被销毁。

实现您要执行的操作的正确方法是将字符串添加到bundle方法中的outstate变量,并从onSaveInstanceState中读取savedInstanceState 1}}。

试试这个:

onCreateView