Android Studio: onActivityResult не выполняется после закрытия галереи

#android #kotlin

#Android #kotlin

Вопрос:

Я новичок в разработке Android и пытаюсь научиться сам. В настоящее время я пытаюсь добавить функциональность в свое приложение, где я нажимаю кнопку, и галерея открывается для пользователя, чтобы выбрать изображение, которое будет использоваться позже, а затем после закрытия галереи должно появиться диалоговое окно. Однако после закрытия галереи ничего не происходит, и кажется, что код onActivityResult() по какой-то причине не выполняется. Я не получаю никаких ошибок в logcat, и отчеты Log.d не отображаются. Код ниже. Спасибо!

   override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        
        Log.d("TEST1", "FUN EXECUTED")


        val fab = view.findViewById<FloatingActionButton>(R.id.fababc)
        fab.setOnClickListener {
            showCreateTodoList()
            Log.d("TEST2", "RECIEVING INPUT")

        }
    }


   private fun showCreateTodoList() {
        openGallery()

    }

 private fun openGallery() {
        val gallery = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI)
        requireActivity().startActivityForResult(gallery, p)
    }
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?)   {
        super.onActivityResult(requestCode, resultCode, data)
        if(resultCode == AppCompatActivity.RESULT_OK amp;amp; requestCode == p){
            Log.d("TESTING", "THIS CODE RUNS")
            imageURI = data!!.data



            activity?.let {
                val dialogTitle = getString(R.string.newScp)
                val positiveButtonTitle = getString(R.string.create)
                val myDialog = AlertDialog.Builder(it)
                val todoTitleEditText = EditText(it)
                todoTitleEditText.inputType =
                        InputType.TYPE_CLASS_TEXT or InputType.TYPE_TEXT_FLAG_CAP_WORDS
                myDialog.setTitle(dialogTitle)
                myDialog.setView(todoTitleEditText)
                myDialog.setPositiveButton(positiveButtonTitle) { dialog, _ ->

                    uri = imageURI.toString()


                    val list = viewData(todoTitleEditText.text.toString(),uri,R.drawable.image,"SCP Name: ", "SCP Class", "Date Discovered: ", "Kill Count:" )
                    addToList(list)
                    dialog.dismiss()
                    ListItemCLickedu(list)

                }
                myDialog.create().show()
            }




        }
        else{  Log.d("TESTING2", "THIS CODE DOES NOT RUN!")


        }
    }




 

Ответ №1:

Основываясь на вашем коде, я пробую это и работает нормально:

  private lateinit var imageURI: Uri

    companion object {
        const val REQUEST_MEDIA = 101
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Log.d("TEST1", "FUN EXECUTED")

        button.setOnClickListener {
            showCreateTodoList()
            Log.d("TEST2", "RECIEVING INPUT")

        }
    }


    private fun showCreateTodoList() {
        openGallery()

    }

    private fun openGallery() {
        val gallery = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.INTERNAL_CONTENT_URI)
        startActivityForResult(gallery, REQUEST_MEDIA)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode == RESULT_OK amp;amp; requestCode == REQUEST_MEDIA) {
            Log.d("TESTING", "THIS CODE RUNS")
            imageURI = data?.data!!

                // Use the Builder class for convenient dialog construction
                val builder = AlertDialog.Builder(this)
                builder.setMessage("Dummy Dialog Title")
                    .setPositiveButton("Ok",
                        DialogInterface.OnClickListener { dialog, id ->
                            // what you want to do on positive click
                            dialog.dismiss()
                        })
                    .setNegativeButton("Cancel",
                        DialogInterface.OnClickListener { dialog, id ->
                            // User cancelled the dialog
                            dialog.dismiss()
                        })
                // Create the AlertDialog object and return it
                builder.create().show()

        }

    }
 

Пожалуйста, проверьте, добавляете ли вы разрешения в свой файл манифеста, а также, если вы находитесь во фрагменте, проверьте, имеет ли activity in activity?.let значение null. Если это так, попробуйте что-нибудь getBaseActivity()?.let или applicationContext?.let и там отобразите свой диалог.