简体   繁体   English

更改方向时将数据保存在Fragment中

[英]Saving data in Fragment on orientation change

What i am trying to do :: I am trying to save the data entered into edittext and spinner onorientation change 我正在尝试做的事情 ::我正在尝试保存输入到edittext和spinner onorientation更改中的数据

What is happening ::: I am not able to save the data, how can i resolve this 发生了什么 :::我无法保存数据,我该如何解决

MainActivity.java MainActivity.java

public class MainActivity extends FragmentActivity {

    Fragment_A frgObj;

    @Override
    protected void onCreate(Bundle arg0) {
        super.onCreate(arg0);
        Log.d("MAIN-ACTIVITY", "onCreate");
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d("MAIN-ACTIVITY", "onStart");
        frgObj=Fragment_A.newInstance();

        getSupportFragmentManager().beginTransaction().replace(R.id.container, frgObj).addToBackStack(null).commit();
    }

    public void onSaveInstanceState(Bundle outState){
           getSupportFragmentManager().putFragment(outState,"myfragment",frgObj);
        }
        public void onRetoreInstanceState(Bundle inState){
            frgObj = (Fragment_A) getSupportFragmentManager().getFragment(inState,"myfragment");
        }
}

Fragment_A.java Fragment_A.java

public class Fragment_A extends Fragment{

    Button btn;
    Spinner spinner;
    EditText editText;
    SeekBar seekBar;

    public static Fragment_A newInstance() {
        Log.d("FRAGMENT-A", "newInstance");

        Fragment_A fragment = new Fragment_A();
        return fragment;
    }

    @Override
    public void onAttach(Activity activity) {
        Log.d("FRAGMENT-A", "onAttach");
        super.onAttach(activity);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d("FRAGMENT-A", "onCreate");
        super.onCreate(savedInstanceState);


    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        Log.d("FRAGMENT-A", "onSaveInstanceState");

        super.onSaveInstanceState(outState);
        //City Spinner state
        outState.putString("editText", editText.getText().toString());
        outState.putInt("yourSpinner", spinner.getSelectedItemPosition());

    }



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        Log.d("FRAGMENT-A", "onCreateView");
        View view=inflater.inflate(R.layout.fragment_a, container, false);

        btn=(Button) view.findViewById(R.id.buttonId1);
        spinner=(Spinner) view.findViewById(R.id.spinnerId1);
        editText=(EditText) view.findViewById(R.id.editTextId1);
        seekBar=(SeekBar) view.findViewById(R.id.seekBarId1);

        return view;
    }


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        Log.d("FRAGMENT-A", "onActivityCreated");
        super.onActivityCreated(savedInstanceState);

         if (savedInstanceState != null) {
                //City Spinner state
             editText.setText(savedInstanceState.getString("editText"));
             spinner.setSelection(savedInstanceState.getInt("yourSpinner", 0));

            }       
    }

    @Override
    public void onStart() {
        Log.d("FRAGMENT-A", "onStart");
        super.onStart();

        btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Log.d("FRAGMENT-A", "button Clicked");

                Fragment_B frgObj=Fragment_B.newInstance();

                getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, frgObj,"Fragment_B").addToBackStack(null).commit();

            }
        });
    }

}

I don't think you need to change anything in your activity other than call super.onSaveInstanceState(Bundle) . 我认为除了调用super.onSaveInstanceState(Bundle)之外,您无需更改活动中的任何内容。 Saving the data onSaveInstanceState in the fragment should be enough. 在片段中将数据保存在onSaveInstanceState上就足够了。 I would put the restoring logic in onCreateView instead of onActivityCreated . 我会将恢复逻辑放在onCreateView而不是onActivityCreated onCreateView is guaranteed to be called whenever the fragment is recreated however this is not the case with onActivityCreated . 保证每当重新创建片段时都会调用onCreateView但是onActivityCreated并非如此。

An other thing you can try is not going any of this and using setRetainInstance(true) which should retain your instance variables through orientation change. 您可以尝试的另一件事是不执行任何操作,而是使用setRetainInstance(true) ,它应该通过方向更改来保留实例变量。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM