有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

每次方向更改并丢失字段值时,java Android OnCreateView调用两次

我知道这是一个被谈论的话题,但最近什么都没有。我按照所有建议的方法不创建两次,但它仍然创建,因此我丢失了信息。有没有关于如何修复的想法?提前感谢您的帮助

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

共 (2) 个答案

  1. # 1 楼答案

    @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));
    }
    
  2. # 2 楼答案

    在方向更改中,您需要将数据保存在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");
            }
    
        }