onActivityResult не отслеживается во фрагменте (Kotlin) - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь открыть сканер и перехватить результат сканирования во фрагментном представлении,

Сканер загружается нормально, но onActivityResult никогда не срабатывает, поэтому я не могу видеть тостер.


import android.R.attr
import android.content.Intent
import android.os.AsyncTask
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ListView
import android.widget.ProgressBar
import android.widget.Toast
import androidx.fragment.app.Fragment
import com.google.zxing.integration.android.IntentIntegrator
import kotlinx.android.synthetic.main.fragment_home.*
import org.json.JSONObject
import java.net.URL


// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private const val ARG_PARAM1 = "param1"
private const val ARG_PARAM2 = "param2"

/**
 * A simple [Fragment] subclass.
 * Use the [HomeFragment.newInstance] factory method to
 * create an instance of this fragment.
 */
class HomeFragment : Fragment() {
    // TODO: Rename and change types of parameters
    private var param1: String? = null
    private var param2: String? = null
    var dataList = ArrayList<HashMap<String, String>>()
    lateinit var progressBar: ProgressBar // Global declare
    lateinit var list: ListView // Global declare


    private var res: View? = null ;


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        arguments?.let {
            param1 = it.getString(ARG_PARAM1)
            param2 = it.getString(ARG_PARAM2)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        scan_btn.setOnClickListener{
            val scanner = IntentIntegrator(requireActivity())
            scanner.initiateScan()
        }
        return inflater.inflate(R.layout.fragment_home, container, false);
    }


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        progressBar = view.findViewById(R.id.loader)
        list = view.findViewById(R.id.listView)
        // Inflate the layout for this fragment

        Toast.makeText(requireActivity(), "ViewCreated: ", Toast.LENGTH_LONG).show()


    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        Toast.makeText(requireActivity(), "Scanned: But reuslt is null", Toast.LENGTH_LONG).show()

        val result =
            IntentIntegrator.parseActivityResult(requestCode, resultCode,data)

        if (result != null) {
            if (result.contents == null) {
                Toast.makeText(requireActivity(), "Cancelled", Toast.LENGTH_LONG).show()
            } else {
                Toast.makeText(requireActivity(), "Scanned: " + result.contents, Toast.LENGTH_LONG).show()
            }
        } else {
            Toast.makeText(requireActivity(), "Scanned: But reuslt is null", Toast.LENGTH_LONG).show()

            super.onActivityResult(requestCode, resultCode, data)
        }
    }
    ```

1 Ответ

0 голосов
/ 27 апреля 2020

Полагаю, именно так вы начинаете сканирование.

val scanner = IntentIntegrator(requireActivity())
scanner.initiateScan()

И, вероятно, ваш requireActivity() метод передает Activity в IntentIntegrator (также следя за тем, чтобы он не был нулевым) .

Это означает, что вы используете Activity для запуска activityForResult, и в этом случае вы получите результат в ответном вызове Activity onActivityResult. Поэтому вам, вероятно, следует создать интерфейс, который отправит полученный результат вашему фрагменту.

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

...