2017-01-25 2 views
2

Я использую Android Pay в одном из своих фрагментов. Вот как (соответствующие части) мой фрагмент выглядит:Невозможно выполнить действие после onSaveInstanceState | AndroidPay

public class PaymentsFragment extends Fragment implements View.OnClickListener, GoogleApiClient.OnConnectionFailedListener { 

private GoogleApiClient mGoogleApiClient; 
private MaskedWallet mMaskedWallet; 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
mGoogleApiClient = new GoogleApiClient.Builder(getActivity()) 
       .addOnConnectionFailedListener(this) 
       .addApi(Wallet.API, new Wallet.WalletOptions.Builder() 
         .setEnvironment(BuildConfig.DEBUG ? WalletConstants.ENVIRONMENT_TEST : WalletConstants.ENVIRONMENT_PRODUCTION) 
         .setTheme(WalletConstants.THEME_LIGHT) 
         .build()) 
       .enableAutoManage(getActivity(), this) 
       .build(); 

Wallet.Payments.isReadyToPay(mGoogleApiClient).setResultCallback(
       new ResultCallback<BooleanResult>() { 
        @Override 
        public void onResult(@NonNull BooleanResult booleanResult) { 
         if (booleanResult.getStatus().isSuccess()) { 
          if (booleanResult.getValue()) { 
           showAndroidPay(); 
          } 
         } 
        } 
       }); 
    } 

private void showAndroidPay() { 
WalletFragmentStyle walletFragmentStyle = new WalletFragmentStyle() 
.setBuyButtonText(WalletFragmentStyle.BuyButtonText.LOGO_ONLY) 
.setBuyButtonAppearance(WalletFragmentStyle.BuyButtonAppearance.ANDROID_PAY_LIGHT) 
.setBuyButtonHeight(WalletFragmentStyle.Dimension.UNIT_DIP, 46); 

    WalletFragmentOptions walletFragmentOptions = WalletFragmentOptions.newBuilder() 
       .setEnvironment(BuildConfig.DEBUG ? WalletConstants.ENVIRONMENT_TEST : WalletConstants.ENVIRONMENT_PRODUCTION) 
       .setFragmentStyle(walletFragmentStyle) 
       .setTheme(WalletConstants.THEME_LIGHT) 
       .setMode(WalletFragmentMode.BUY_BUTTON) 
       .build(); 

     PaymentMethodTokenizationParameters params = null; 
     if (requestMethod.getGateway().getType() == PaymentGateway.PaymentGatewayType.STRIPE) { 
      params = PaymentMethodTokenizationParameters.newBuilder() 
        .setPaymentMethodTokenizationType(PaymentMethodTokenizationType.PAYMENT_GATEWAY) 
        .addParameter(GOOGLE_WALLET_GATEWAY, PaymentGateway.PaymentGatewayType.STRIPE.toString().toLowerCase()) 
        .addParameter(GOOGLE_WALLET_STRIPE_KEY, ((StripePaymentGateway) requestMethod.getGateway()).getPublishableKey()) 
        .addParameter(GOOGLE_WALLET_STRIPE_VERSION, com.stripe.Stripe.VERSION) 
        .build(); 
     } else { 
      //later 
     } 

     MaskedWalletRequest maskedWalletRequest = MaskedWalletRequest.newBuilder() 
       .setMerchantName("") 
       .setPaymentMethodTokenizationParameters(params) 
       .setPhoneNumberRequired(false) 
       .setShippingAddressRequired(false) 
       .setEstimatedTotalPrice(100.0) 
       .setCurrencyCode("USD") 
       .build(); 

     WalletFragmentInitParams initParams = WalletFragmentInitParams.newBuilder() 
       .setMaskedWalletRequest(maskedWalletRequest) 
       .setMaskedWalletRequestCode(LOADER_MASKED_WALLET_REQUEST_CODE) 
       .build(); 

     SupportWalletFragment walletFragment = SupportWalletFragment.newInstance(walletFragmentOptions); 
     walletFragment.initialize(initParams); 

if (walletFragment != null) { 
      getFragmentManager().beginTransaction() 
        .replace(R.id.androidpay_fragment_holder, walletFragment) 
        .commit(); 

     } 
    } 
} 

Теперь, когда я пытаюсь повернуть устройство после нажатия на кнопку AndroidPay, то приложение падает с исключением:

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

в точке, где я совершаю команду showAndroidPay(). Я знаю об этом article, в котором говорится, что не должно быть коммита FragmentTransaction из асинхронного метода. Но в моем случае я могу показать только опцию Android Pay, когда я получаю успех от обратного вызова. И вот как это делает sample app. Единственная разница в том, что это делается в Activity.onCreate() против Fragment.onCreaveView() в моем случае.

Любая идея, как я могу решить этот issus?

ответ

0

Попробуйте это:

if (walletFragment != null) { 
      getFragmentManager().beginTransaction() 
        .replace(R.id.androidpay_fragment_holder, walletFragment) 
        .commitAllowingStateLoss(); 

     } 
+0

да, я в курсе этого решения. Я чувствую, что это скорее хак. – Nerd

Смежные вопросы