【发布时间】: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