2016-03-02 56 views
0

我有一個包含BroadcastReceiver的Fragment,它包含在Activity中。活動具有意圖 - 篩選以確定應用程序鏈接。在片段中的一些操作之後,我通過應用程序鏈接從服務器獲取電子郵件。所以當我點擊設備上的home按鈕時,應用程序不會銷燬,當我點擊電子郵件中的鏈接時,必須打開一個新的片段,但是我有一個IllegalStateException,並且文本爲Can not perform this action after saveInstanceState。如何解決它?下面我附上了我的活動,兩個片段代碼:當通過另一個應用程序運行應用程序時,Android無法執行saveInstanceState後的此操作

public class PerfectoActivity extends AppCompatActivity implements ProgressUpdater, AuthFragment.ProgressActivator { 

    @Bind(R.id.sign_up_progress) ProgressBar mSignUpProgressBar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_perfecto); 
     ButterKnife.bind(this); 
     if (cameFromMail()) { 
      if (isSignUpProcess()) { 
       mSignUpProgressBar.setVisibility(View.VISIBLE); 
       String login = Utils.getLogin(this); 
       String password = Utils.getPassword(this); 
       String username = Utils.getUsername(this); 
       String phone = Utils.getPhone(this); 
       Utils.removePasswordAndPhone(this); 
       ApiService.startActionAuth(this, login, password); 
       getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, SignUpThirdStepFragment.newInstance(username, phone)).commit(); 
      } else { 
       String login = Utils.getLogin(this); 
       String resetCode = Utils.getResetCode(this); 
       ApiService.startActionCheckConfirmReset(this, login, resetCode); 
       getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, ResetPasswordFourthStepFragment.newInstance(login, resetCode)).commit(); 
      } 
     } else { 
      Utils.removePasswordAndPhone(this); 
      getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, new AuthFragment()).commit(); 
     } 
    } 

    private boolean isSignUpProcess() { 
     Intent intent = getIntent(); 
     if (intent.getData() != null) { 
      if (intent.getData().getLastPathSegment().equals("confirmreset")) { 
       return false; 
      } 
      return true; 
     } 
     return false; 
    } 

    private boolean cameFromMail() { 
     Intent intent = getIntent(); 
     if (intent.getData() != null) 
     if (Intent.ACTION_VIEW.equals(intent.getAction())) return true; 
     return false; 
    } 

    @Override 
    public void updateProgress(int progress) { 
     mSignUpProgressBar.setProgress(progress); 
    } 

    @Override 
    public void activateProgress() { 
     if (mSignUpProgressBar.getVisibility() == View.VISIBLE) { 
      mSignUpProgressBar.setVisibility(View.GONE); 
     } 
     else { 
      mSignUpProgressBar.setVisibility(View.VISIBLE); 
     } 
    } 
} 

這是第一個片段

public class ResetPasswordSecondStepFragment extends Fragment { 


    private static final String BUNDLE_LOGIN = "com.rcd.perfecto.fragments.ResetPasswordSecondStep.bundle.LOGIN"; 
    public static final String RESET_PASSWORD_FILTER = "com.rcd.perfecto.fragments.filter.RESET_PASSWORD"; 

    private String mLogin; 
    private BroadcastReceiver mReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (!intent.getBooleanExtra(ApiService.EXTRA_SUCCESS, false)) { 
       mPhoneErrorTextView.setVisibility(View.VISIBLE); 
       mPhoneErrorTextView.setText(intent.getStringExtra(ApiService.EXTRA_MESSAGE)); 
      } else { 
       String phone = mLastDigitsEditText.getText().toString(); 
       String resetCode = intent.getStringExtra(ApiService.EXTRA_DATA); 
       FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction(); 
       transaction.replace(R.id.fragment_container, ResetPasswordThirdStepFragment.newInstance(mLogin, phone, resetCode)).commit(); 
      } 
     } 
    }; 

    @Bind(R.id.et_last_digits) EditText mLastDigitsEditText; 
    @Bind(R.id.tv_phone_error) TextView mPhoneErrorTextView; 

    @OnTextChanged(R.id.et_last_digits) 
    void resetPassword(CharSequence digits) { 
     if (digits.length() == 4) ApiService.startActionResetPassword(getActivity(), mLogin, mLastDigitsEditText.getText().toString()); 
    } 

    public ResetPasswordSecondStepFragment() { 
     // Required empty public constructor 
    } 

    public static ResetPasswordSecondStepFragment newInstance(String login) { 
     ResetPasswordSecondStepFragment fragment = new ResetPasswordSecondStepFragment(); 
     Bundle args = new Bundle(); 
     args.putString(BUNDLE_LOGIN, login); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Bundle args = getArguments(); 
     if (args != null) { 
      mLogin = args.getString(BUNDLE_LOGIN); 
     } 
     LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver, new IntentFilter(RESET_PASSWORD_FILTER)); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_reset_password_second_step, container, false); 
     ButterKnife.bind(this, view); 
     return view; 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mReceiver); 
    } 
} 

,最後一個

public class ResetPasswordThirdStepFragment extends Fragment { 

    private static final String BUNDLE_LOGIN = "com.rcd.perfecto.fragments.bundle.LOGIN"; 
    private static final String BUNDLE_RESET_CODE = "com.rcd.perfecto.fragments.bundle.RESET_CODE"; 
    private static final String BUNDLE_PHONE = "com.rcd.perfecto.fragments.bundle.PHONE"; 

    public static final String CHECK_CONFIRM_RESET_FILTER = "com.rcd.perfecto.fragments.filters.CHECK_CONFIRM_RESET"; 

    private String mResetCode; 
    private String mLogin; 
    private String mPhone; 

    private BroadcastReceiver mConfirmReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (!intent.getBooleanExtra(ApiService.EXTRA_SUCCESS, false)) { 
       Utils.showAlert(R.string.reset_password_error, intent.getStringExtra(ApiService.EXTRA_MESSAGE), getActivity()); 
      } else { 
       if (intent.getBooleanExtra(ApiService.EXTRA_DATA, false)) { 
        FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction(); 
        transaction.replace(R.id.fragment_container, ResetPasswordFourthStepFragment.newInstance(mLogin, mResetCode)).commit(); 
       } else { 
        Utils.showAlert(R.string.reset_password_error, getResources().getString(R.string.reset_password_error_desc), getActivity()); 
       } 
      } 
     } 
    }; 

    private BroadcastReceiver mSendConfirmationReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (!intent.getBooleanExtra(ApiService.EXTRA_SUCCESS, false)) { 
       Utils.showAlert(R.string.reset_password_error, intent.getStringExtra(ApiService.EXTRA_MESSAGE), getActivity()); 
      } else { 
       mResetCode = intent.getStringExtra(ApiService.EXTRA_DATA); 
       Utils.showAlert(R.string.sign_up_confirmation_link_title, getResources().getString(R.string.sign_up_confirmation_link), getActivity()); 
      } 
     } 
    }; 

    @Bind(R.id.btn_continue) Button mContinueButton; 
    @Bind(R.id.tv_not_got_email) TextView mNotGotMailTextView; 

    @OnClick(R.id.btn_continue) 
    void confirmResetting() { 
     ApiService.startActionCheckConfirmReset(getActivity(), mLogin, mResetCode); 
    } 

    @OnClick(R.id.tv_not_got_email) 
    void sendConfirmationAgaing() { 
     ApiService.startActionResetPassword(getActivity(), mLogin, mPhone); 
    } 

    public ResetPasswordThirdStepFragment() { 
     // Required empty public constructor 
    } 

    public static ResetPasswordThirdStepFragment newInstance(String login, String phone, String resetCode) { 
     ResetPasswordThirdStepFragment fragment = new ResetPasswordThirdStepFragment(); 
     Bundle args = new Bundle(); 
     args.putString(BUNDLE_LOGIN, login); 
     args.putString(BUNDLE_PHONE, phone); 
     args.putString(BUNDLE_RESET_CODE, resetCode); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Bundle args = getArguments(); 
     if (args != null) { 
      mLogin = args.getString(BUNDLE_LOGIN); 
      mPhone = args.getString(BUNDLE_PHONE); 
      mResetCode = args.getString(BUNDLE_RESET_CODE); 
      Utils.saveLogin(getActivity(), mLogin); 
      Utils.savePhone(getActivity(), mPhone); 
      Utils.saveResetCode(getActivity(), mResetCode); 
     } 
      LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mConfirmReceiver, new IntentFilter(CHECK_CONFIRM_RESET_FILTER)); 
     LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mSendConfirmationReceiver, new IntentFilter(ResetPasswordSecondStepFragment.RESET_PASSWORD_FILTER)); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_reset_password_third_step, container, false); 
     ButterKnife.bind(this, view); 
     return view; 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mConfirmReceiver); 
     LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(mSendConfirmationReceiver); 
    } 
} 

回答

1

我看到你在做一些片段交易在您的BroadcastReceivers中,所以這些操作可以在活動暫停並且已經調用onSaveInstanceState時執行。 嘗試使用FragmentTransaction.commitAllowingStateLoss()而不是簡單FragmentTransaction.commit();

+0

謝謝。有用! –

相關問題