Я использую 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?
да, я в курсе этого решения. Я чувствую, что это скорее хак. – Nerd