java - 如何在片段中使用 onActivityResult()?
问题描述
在我的应用程序中,我想使用InAppBillling购买一些功能!
我将付款方式写入fragment
但在显示付款dialog
和用户付款后不会向我显示任何数据onActivityResult
!
我写入log.e
,onActivityResult
但又不显示。
我觉得进不去onActivityResult
!
我的片段代码:
public class ServicesFragment extends BaseFragment implements IabHelper.OnIabSetupFinishedListener,
IabHelper.QueryInventoryFinishedListener, IabHelper.OnIabPurchaseFinishedListener, IabHelper.OnConsumeFinishedListener {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_services, container, false);
...
}
@Override
public void onIabSetupFinished(IabResult result) {
if (iabHelper != null) {
iabHelper.flagEndAsync();
//This is call for payment
iabHelper.queryInventoryAsync(ServicesFragment.this);
}
}
@Override
public void onIabPurchaseFinished(IabResult result, final Purchase info) {
//After payment call this
if (result.isSuccess() && info != null) {
handler.post(new Runnable() {
@Override
public void run() {
getCheckBuyFromBazaar(jwtToken, packageName, productId, purchaseToken, buyID, 0, info);
}
});
}
}
@Override
public void onQueryInventoryFinished(IabResult result, Inventory inv) {
if (result.isSuccess()) {
bazaarProgressDialog.dismiss();
//Run bazaar dialog
if (iabHelper != null) {
iabHelper.flagEndAsync();
iabHelper.launchPurchaseFlow(activity, bazaarSKU, bazaarRequestCode,
ServicesFragment.this, bazaarHashCode);
}
}
}
@Override
public void onConsumeFinished(Purchase purchase, IabResult result) {
if (result.isSuccess() && purchase != null) {
if (purchase.getSku().equalsIgnoreCase(bazaarSKU)) {
//When purchase consumed
finishPage();
loadingProgressDialog.dismiss();
}
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.e("BazaarPaymentLog", "Result");
if (iabHelper == null) return;
if (requestCode == bazaarRequestCode) {
String purchaseData = data.getStringExtra("INAPP_PURCHASE_DATA");
if (resultCode == RESULT_OK) {
try {
JSONObject jo = new JSONObject(purchaseData);
purchaseToken = jo.getString("purchaseToken");
productId = jo.getString("productId");
packageName = jo.getString("packageName");
Log.e("BazaarPaymentLog", "purchaseToken : " + purchaseToken);
if (iabHelper != null) {
iabHelper.handleActivityResult(requestCode, resultCode, data);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
} else {
super.onActivityResult(requestCode, resultCode, data);
}
}
}
显示付款对话框,我付款,但之后不去onActivityResult
!
我将上面的代码写入activity
它可以运行onActivityResult
但fragment
不进入onActivityResult
!
我该如何解决?
解决方案
实际上,结果被传递给 Activity 的 onActivtyResult 以便进入 Fragment 的方法,您需要将结果从 Activity 传递给 Fragment,如下所示
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.frame);
fragment.onActivityResult(requestCode, resultCode, data);
}
并在 Fragment 中调用它与您当前调用的相同
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}
如果您使用的是 ViewPager,您可以获得如下所示的 Fragment
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Fragment mFragment = myPagerAdapter.getItem(mViewPager.getCurrentItem());
if (fragment instanceof ServiccesFragment){
((ServiccesFragment)fragment).onActivityResult(requestCode, resultCode, data);
}
}
推荐阅读
- docker - Traefik“请求已中止”和“TLS握手错误”错误出现在日志中
- google-chrome-extension - 获取页面更改的 url
- c++ - 更改单元测试的类功能的正确方法?
- javascript - 根据日期列表查找每个数据库行的最接近日期
- r - R -- 扩展函数 -- 直接使用列名与 df$column 的区别
- scala - releasePublishArtifactsAction 似乎没有抓住
- c# - Lambda 选择没有表达式的列
- c# - 你能在 C# 中列出指针吗?
- google-apps-script - 当范围之和为零时隐藏一行
- wso2 - 为什么 WSO2 IS 5.6.0 SCIM2 Group API 在尝试插入或更新用户时会抛出错误?