【问题标题】:Can not perform action after onSaveInstanceState | AndroidPayonSaveInstanceState 后无法执行操作 |安卓支付
【发布时间】:2017-06-11 05:23:13
【问题描述】:

我在我的一个片段中使用 Android Pay。以下是我的片段(相关部分)的外观:

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() 中完成的。

知道如何解决这个问题吗?

【问题讨论】:

    标签: android android-pay


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 是的,我知道这个解决方案。我觉得这更像是一种黑客行为。
    猜你喜欢
    • 1970-01-01
    • 2014-10-18
    • 2014-03-05
    • 2017-06-21
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多