android onActivityResult не вызывается во фрагменте - PullRequest
0 голосов
/ 23 января 2020

Я хочу реализовать в биллинге приложения этот образец . Я реализую его во фрагменте. Все в порядке. Но когда возвращается результат, я должен вызвать onactivityresult. Я использую onactivityresult во фрагменте для доступа к aibHelper, чтобы управлять им, но onactivityresult никогда не будет вызываться. Что я должен сделать, чтобы onactivityresult во фрагменте

это мои коды:

class CartFragment : Fragment(), IabHelper.OnIabPurchaseFinishedListener,IabHelper.OnConsumeFinishedListener {

    lateinit var viewModel: CartViewModel
    lateinit var bazarViewModel: BazarViewModel
    lateinit var iabHelper: IabHelper
    var productId = ""
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        var view = inflater.inflate(R.layout.fragment_cart, container, false)
        var recycler = view.findViewById<RecyclerView>(R.id.rv_cart_list)
        recycler.layoutManager = LinearLayoutManager(context)
        iabHelper = IabHelper(context, resources.getString(R.string.rsa))
        iabHelper.startSetup {
            if (it.isSuccess) {
                Log.i("LOG", "setup finished")
                Toast.makeText(context,"ready",Toast.LENGTH_SHORT).show()
            }
        }
        viewModel = ViewModelProviders.of(this).get(CartViewModel::class.java)
        viewModel.getProduct().observe(this, Observer {
            recycler.adapter = CartAdapter(it) {
                productId = it
                iabHelper.launchPurchaseFlow(activity!!,it,1003,this)
            }
        })
        return view
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (requestCode == 1003) {
            iabHelper.handleActivityResult(requestCode, resultCode, data)
            Log.i("LOG", "on activity if")
        } else {
            Log.i("LOG", "on activity else")
            super.onActivityResult(requestCode, resultCode, data)
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        iabHelper.dispose()

    }
    override fun onIabPurchaseFinished(result: IabResult?, info: Purchase?) {
        Log.i("LOG", "on purchase finished")
        iabHelper.consumeAsync(info,this)
    }
    override fun onConsumeFinished(purchase: Purchase?, result: IabResult?) {
        Toast.makeText(context,"consume success",Toast.LENGTH_SHORT).show()
        Log.i("LOG","consume finished")

    }
}

Ответы [ 2 ]

1 голос
/ 23 января 2020

Я думаю, что вы вызываете startActivityForResult в классе IabHelper. Вы должны вызывать Fragment.startActivityForResult, а не Activity.startActivityForResult. Для этого в классе IabHelper необходимо реализовать два метода: один с параметром активности, а другой с параметром фрагмента

0 голосов
/ 23 января 2020

Обычно это происходит, когда родительское действие реализует onActivityResult() и полностью использует его, не возвращая его. В действии фрагмента убедитесь, что вы возвращаете onActivityResult, когда бы вы его ни внедрили. например. Внутри своей деятельности вы можете реализовать onActivityResult следующим образом:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (requestCode == REQUEST_CODE) {
        //perform some actions
    } else {
        Log.i("LOG", "on activity else")
        //perform another actions
    }
  return super.onActivityResult(requestCode, resultCode, data) //this line is the most important
}
...