簡體   English   中英

Android —兩次調用OnCreateView-每次方向更改並丟失字段值

[英]Android — OnCreateView called twice - each time the orientation changes and loses the field values

我知道這是一個話題,但是最近沒有。 我遵循了建議不要重復創建的所有方法,但是仍然可以重復,因此我丟失了信息。 有關如何解決的任何想法? 先謝謝您的幫助!

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
    mRootView = inflater.inflate(R.layout.fragment_base_info, container, false);
    getActivity().setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
    mShantiName = (EditText) mRootView.findViewById(R.id.baseInfoShantiName);
    mEmail = (EditText) mRootView.findViewById(R.id.baseInfoEmail);
    mPassword = (EditText) mRootView.findViewById(R.id.baseInfoPassword);
    mFirstName = (EditText) mRootView.findViewById(R.id.baseInfoFirstName);
    mLastName = (EditText) mRootView.findViewById(R.id.baseInfoLastName);
    mPhone = (EditText) mRootView.findViewById(R.id.baseInfoPhone);
    mPhonePerfixMS = (MultiSpinner) mRootView.findViewById(R.id.baseInfoPhonePrefix);
    mShantiName.setText("fh");
    mEmail.setText("d@f.com");
    mPassword.setText("33ddSS..");
    mFirstName.setText("gh");
    mLastName.setText("rf");
    mPhone.setText("5551212");

    a++;
    DeviceDisplayLanguage = Locale.getDefault().getDisplayLanguage();
    if (DeviceDisplayLanguage.equals(getActivity().getString(R.string.DeviceDisplayGerman)))
        mPassword.setGravity(Gravity.CENTER_VERTICAL|View.TEXT_ALIGNMENT_VIEW_START);
    if (Common.user != null && ((Common.user.getNvGoogleUserId() != null && !Common.user.getNvGoogleUserId().equals("")) || (Common.user.getNvFacebookUserId() != null && !Common.user.getNvFacebookUserId().equals("")))) {
        isLoginWith = true;
        mPassword.setVisibility(View.GONE);
        init();
    } else {
        isLoginWith = false;
        mPassword.setVisibility(View.VISIBLE);
    }
    if (savedInstanceState != null) {
        i++;
        mShantiName.setText(savedInstanceState.get("Name").toString());
        mEmail.setText(savedInstanceState.get("Email").toString());
        mPassword.setText(savedInstanceState.get("Password").toString());
        mFirstName.setText(savedInstanceState.get("FirstName").toString());
        mLastName.setText(savedInstanceState.get("LastName").toString());
        mPhone.setText(savedInstanceState.get("Phone").toString());
    }
    Toast.makeText(getActivity(), "i=" + i + "j=" + j + "a=" + a,
            Toast.LENGTH_SHORT).show();


    TelephonyManager tMgr = (TelephonyManager) getActivity().getSystemService(Context.TELEPHONY_SERVICE);
    mPhonePerfix = (CountryToPhonePrefix.prefixFor(tMgr.getNetworkCountryIso().toUpperCase()));
    initializer = new CustomViewsInitializer(getActivity());
    if (((MultiSpinner) mRootView.findViewById(R.id.baseInfoPhonePrefix)).getChooseValues().size() > 0)
        selected = ((MultiSpinner) mRootView.findViewById(R.id.baseInfoPhonePrefix)).getChooseValues().get(0);

    initializer.setSpinner(mPhonePerfixMS, CodeValue.countries, getString(R.string.signUpPhonePrefix), selected);


   // InitValidation();
    mRootView.findViewById(R.id.baseInfoCreateUserBtn).setOnClickListener(this);
    mShantiName.requestFocus();
    return mRootView;
}

在方向更改中,您需要將數據保存在onSaveInstanceState方法中,我想您錯過了該方法,這就是丟失字段值的原因。

//Here you Save your data
    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("Name", mShantiName.getText().toString());
        outState.putString("Email", mEmail.getText().toString());
        outState.putString("Password", mPassword.getText().toString());
        outState.putString("FirstName", mFirstName.getText().toString());
        outState.putString("LastName", mLastName.getText().toString());
        outState.putString("Phone", mPhone.getText().toString());


    }

范例:

public class Fragment_1 extends Fragment {


        private EditText title;
        private Button go_next;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setRetainInstance(true); //Will ignore onDestroy Method (Nested Fragments no need this if parent have it)
        }


        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            onRestoreInstanceStae(savedInstanceState);
            return super.onCreateView(inflater, container, savedInstanceState);
        }


        //Here you can restore saved data in onSaveInstanceState Bundle
        private void onRestoreInstanceStae(Bundle savedInstanceState){
            if(savedInstanceState!=null){
                String SomeText = savedInstanceState.getString("title");            
            }
        }

        //Here you Save your data
        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            outState.putString("title", "Some Text");
        }

    }
@Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        if (mSpinnerstate != null)
            outState.putInt("category", mSpinnerstate.getSelection());
        // do this for each or your Spinner
        // You might consider using Bundle.putStringArray() instead
    }
  @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
          if (savedInstanceState != null)
                        mSpinnerstate.setSelection(savedInstanceState.getInt("category", 0));
}

暫無
暫無

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

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