从Fragment调用startIntentSenderForResult(Android Billing v3)

ash*_*hes 53 android android-fragments android-activity android-billing

新的Android Billing v3文档和帮助程序代码startIntentSenderForResult()在启动购买流程时使用.我想从a开始购买流程(并收到结果)Fragment.

例如,文档建议调用

startIntentSenderForResult(pendingIntent.getIntentSender(),
    1001, new Intent(), Integer.valueOf(0), Integer.valueOf(0),
    Integer.valueOf(0));
Run Code Online (Sandbox Code Playgroud)

帮助程序代码调用

mHelper.launchPurchaseFlow(this, SKU_GAS, 10001,   
    mPurchaseFinishedListener, "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");
Run Code Online (Sandbox Code Playgroud)

哪个叫startIntentSenderForResult().

问题是,在父节点上调用调用startIntentSenderForResult()原因而不是从调用它的位置(调用位置)调用原因.onActivityResult()ActivityFragmentIabHelper

我无法接受的onActivityResult()Activity,然后手动调用onActivityResult()Fragment,但有一种方法,使一个呼叫startIntentSenderForResult()从一个Fragment直接结果返回到FragmentonActivityResult()

LEO*_*LEO 36

我建议两种解决方案:

1.)将IabHelper mHelper放在活动上,并从片段中调用IabHelper.

就像是:

要使用此解决方案,请在活动中将IabHelper声明为public,并使用方法从Fragment中调用启动器.

public class MyActivity extends Activity{

    public IabHelper mHelper

    public purchaseLauncher(){

    mHelper.launchPurchaseFlow(this, SKU_GAS, 10001,   
         mPurchaseFinishedListener, "bGoa+V7g/yqDXvKRqq+JTFn4uQZbPiQJo4pf9RzJ");

   }

    /*The finished, query and consume listeners should also be implemented in here*/
}

public class FragmentActivity extends Fragment{

      MyActivity myAct = (MyActivity) getActivity();

      myAct.purchaseLauncher();

}
Run Code Online (Sandbox Code Playgroud)

2.)在onActivityResult中,调用包含IabHelper对象的相应片段.适当的片段可以具有对辅助对象的访问方法.

protected void onActivityResult(int requestCode, int resultCode,Intent data)    
{
    super.onActivityResult(requestCode, resultCode, data);

    FragmentManager fragmentManager = getSupportFragmentManager();
    Fragment fragment = fragmentManager.findFragmentByTag("YourTag");       
    if (fragment != null)
    {
        ((MyFragmentWithIabHelper)fragment).onActivityResult(requestCode, resultCode,data);
    } 
}
Run Code Online (Sandbox Code Playgroud)

  • @RogerAlien正确,但是没有使用`Fragment.startActivityForResult`,而是`startIntentSenderForResult()`,它不会屏蔽请求代码,因此它被转发到适当的片段. (5认同)
  • 如果有一种方法可以将结果自动定向到片段的`onActivityResult()`,那就太好了.类似于从片段调用`startActivityForResult()`而不是调用`getActivity().startActivityForResult()`. (2认同)

小智 9

1)您应该修改resultCode(RC_REQUEST)以将片段索引放入其中.

int rc_reqest = RC_REQUEST +  ((getActivity().getSupportFragmentManager().getFragments().indexOf(this)+1)<<16)  ;      
mHelper.launchPurchaseFlow(getActivity(), sku, rc_reqest ,mPurchaseFinishedListener, payload);
Run Code Online (Sandbox Code Playgroud)

2)在IabHelper.launchPurchaseFlow(...)中

change mRequestCode = requestCode
Run Code Online (Sandbox Code Playgroud)

mRequestCode = requestCode&0xffff;
Run Code Online (Sandbox Code Playgroud)