簡體   English   中英

更改方向時將數據保存在Fragment中

[英]Saving data in Fragment on orientation change

我正在嘗試做的事情 ::我正在嘗試保存輸入到edittext和spinner onorientation更改中的數據

發生了什么 :::我無法保存數據,我該如何解決

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

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

            }
        });
    }

}

我認為除了調用super.onSaveInstanceState(Bundle)之外,您無需更改活動中的任何內容。 在片段中將數據保存在onSaveInstanceState上就足夠了。 我會將恢復邏輯放在onCreateView而不是onActivityCreated 保證每當重新創建片段時都會調用onCreateView但是onActivityCreated並非如此。

您可以嘗試的另一件事是不執行任何操作,而是使用setRetainInstance(true) ,它應該通過方向更改來保留實例變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM