为什么我的 imageView 没有随着 registerForActivityResult 而改变?

Why my imageView doesn't change with registerForActivityResult?

我想制作一个应用程序,在 bottomNavigationView 上单击 button 并打开 PopupWindow,我可以从我的图库中选择图像(缩略图)和视频,添加说明和标题。然后将提供的数据添加到 recyclerView。但是我在从图库中选取图像时遇到问题,它似乎可以工作,我可以从图库中选取图像,但它不会像预期的那样更改 popupWindow 中的图像。

MainActivity.kt

class MainActivity : AppCompatActivity() {

private val home = HomeFragment()
private val player = PlayerFragment()
private val profile = ProfileFragment()
private val settings = SettingsFragment()



private val getPreviewImage = registerForActivityResult(ActivityResultContracts.GetContent(), ActivityResultCallback {
    val dialogView: View = layoutInflater.inflate(R.layout.popup, null)
    dialogView.imageChange.setImageURI(it)
})

private val getPreviewVideo = registerForActivityResult(ActivityResultContracts.GetContent(), ActivityResultCallback {
    val dialogView: View = layoutInflater.inflate(R.layout.popup, null)
    dialogView.VideoSelect.setImageURI(it)
})

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


    val popupButton: FloatingActionButton = findViewById(R.id.fab)
    val bottomNav: BottomNavigationView = findViewById(R.id.bottomNavigationView)

    bottomNav.background = null
    bottomNav.menu.findItem(R.id.placeholder).isEnabled = false
    replaceFragment(home)

    bottomNav.setOnItemSelectedListener {
        when (it.itemId) {
            R.id.home -> replaceFragment(home)
            R.id.player -> replaceFragment(player)
            R.id.profile -> replaceFragment(profile)
            R.id.settings -> replaceFragment(settings)
        }
        true
    }
    popupButton.setOnClickListener {
        showDialog()
    }

}
private fun replaceFragment(fragment: Fragment) {
    val transaction = supportFragmentManager.beginTransaction()
    transaction.replace(R.id.fragment_container, fragment)
    transaction.commit()
}

private fun showDialog() {

    val title = RecyclerAdapter().titles
    val description = RecyclerAdapter().details
    val video = RecyclerAdapter().videos

    val dialog = Dialog(this)
    val dialogView: View = layoutInflater.inflate(R.layout.popup, null)

    val imageView = dialogView.findViewById<ImageView>(R.id.imageChange)
    val videoView = dialogView.findViewById<ImageView>(R.id.VideoSelect)

    val buttonImage = dialogView.findViewById<Button>(R.id.addImage)

    val titleEditText = dialogView.findViewById<EditText>(R.id.titleEdit) //popUp edit field title
    val descEditText = dialogView.findViewById<EditText>(R.id.description) //popUp pole edit field description


    dialogView.addImage.setOnClickListener {
        getPreviewImage.launch("image/*")
    }

    dialogView.addVideo.setOnClickListener {
        getPreviewVideo.launch("video/*")
    }

    dialogView.addButton.setOnClickListener {
        if (titleEditText.text.isEmpty()){
            Toast.makeText(applicationContext, "add required data", Toast.LENGTH_SHORT).show()
        }else{
            Toast.makeText(applicationContext, "Added", Toast.LENGTH_SHORT).show()
        }
    }
    dialog.setContentView(dialogView)
    dialog.show()
  }
}
 popupButton.setOnClickListener {
    showDialog()
  // Should it be notified here that the fragment updates the ui data
}

尝试为 dialogView 布局使用全局变量并检查 URI 是否存在:

class MainActivity : AppCompatActivity() {

    private val home = HomeFragment()
    private val player = PlayerFragment()
    private val profile = ProfileFragment()
    private val settings = SettingsFragment()

    private var dialogView: View? = null
    
    private val getPreviewImage = registerForActivityResult(ActivityResultContracts.GetContent(), ActivityResultCallback {
        it?.let { uri -> 
            dialogView?.findViewById<ImageView>(R.id.imageChange)?.setImageURI(it)
        } ?: run {
            Log.e("MainActivity", "URI not present")
        }
    })
    
    private val getPreviewVideo = registerForActivityResult(ActivityResultContracts.GetContent(), ActivityResultCallback {
        it?.let { uri -> 
            dialogView?.findViewById<ImageView>(R.id.VideoSelect)?.setImageURI(it)
        } ?: run {
            Log.e("MainActivity", "URI not present")
        }
    })
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    
        val popupButton: FloatingActionButton = findViewById(R.id.fab)
        val bottomNav: BottomNavigationView = findViewById(R.id.bottomNavigationView)
    
        bottomNav.background = null
        bottomNav.menu.findItem(R.id.placeholder).isEnabled = false
        replaceFragment(home)
    
        bottomNav.setOnItemSelectedListener {
            when (it.itemId) {
                R.id.home -> replaceFragment(home)
                R.id.player -> replaceFragment(player)
                R.id.profile -> replaceFragment(profile)
                R.id.settings -> replaceFragment(settings)
            }
            true
        }
        popupButton.setOnClickListener {
            showDialog()
        }
    
    }
    private fun replaceFragment(fragment: Fragment) {
        val transaction = supportFragmentManager.beginTransaction()
        transaction.replace(R.id.fragment_container, fragment)
        transaction.commit()
    }
    
    private fun showDialog() {
    
        val title = RecyclerAdapter().titles
        val description = RecyclerAdapter().details
        val video = RecyclerAdapter().videos
    
        val dialog = Dialog(this)
        dialogView = layoutInflater.inflate(R.layout.popup, null)
    
        val buttonImage = dialogView?.findViewById<Button>(R.id.addImage)
    
        val titleEditText = dialogView?.findViewById<EditText>(R.id.titleEdit) //popUp edit field title
        val descEditText = dialogView?.findViewById<EditText>(R.id.description) //popUp pole edit field description
    
        dialogView?.addImage.setOnClickListener {
            getPreviewImage.launch("image/*")
        }
    
        dialogView?.addVideo.setOnClickListener {
            getPreviewVideo.launch("video/*")
        }
    
        dialogView?.addButton.setOnClickListener {
            if (titleEditText.text.isEmpty()){
                Toast.makeText(applicationContext, "add required data", Toast.LENGTH_SHORT).show()
            }else{
                Toast.makeText(applicationContext, "Added", Toast.LENGTH_SHORT).show()
            }
        }

        dialog.setContentView(dialogView)
        dialog.show()
      }
    }

这是最终代码,感谢@Luca Pizzini。但是有一些变化

class MainActivity : AppCompatActivity() {

private val home = HomeFragment()
private val player = PlayerFragment()
private val profile = ProfileFragment()
private val settings = SettingsFragment()

private var dialogView: View? = null


private val getPreviewImage = registerForActivityResult(ActivityResultContracts.GetContent(), ActivityResultCallback {
    it?.let { uri ->
        dialogView?.findViewById<ImageView>(R.id.imageChange)?.setImageURI(it)
    }?:run {
        Log.e("MainActivity", "URI not present")
    }
})
private val getPreviewVideo = registerForActivityResult(ActivityResultContracts.GetContent(), ActivityResultCallback {
it?.let { uri ->
    dialogView?.findViewById<ImageView>(R.id.VideoSelect)?.setImageURI(it)
}?: run{
    Log.e("MainActivity", "URI not present")
}

})

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


    val popupButton: FloatingActionButton = findViewById(R.id.fab)
    val bottomNav: BottomNavigationView = findViewById(R.id.bottomNavigationView)

    bottomNav.background = null
    bottomNav.menu.findItem(R.id.placeholder).isEnabled = false
    replaceFragment(home)

    bottomNav.setOnItemSelectedListener {
        when (it.itemId) {
            R.id.home -> replaceFragment(home)
            R.id.player -> replaceFragment(player)
            R.id.profile -> replaceFragment(profile)
            R.id.settings -> replaceFragment(settings)
        }
        true
    }
    popupButton.setOnClickListener {
        showDialog()
    }

}
private fun replaceFragment(fragment: Fragment) {
    val transaction = supportFragmentManager.beginTransaction()
    transaction.replace(R.id.fragment_container, fragment)
    transaction.commit()
}

private fun showDialog() {

    val title = RecyclerAdapter().titles
    val description = RecyclerAdapter().details
    val video = RecyclerAdapter().videos

    val dialog = Dialog(this)
     dialogView = layoutInflater.inflate(R.layout.popup, null)


    val buttonImage = dialogView?.findViewById<Button>(R.id.addImage)

    val titleEditText = dialogView?.findViewById<EditText>(R.id.titleEdit) //popUp edit field title
    val descEditText = dialogView?.findViewById<EditText>(R.id.description) //popUp pole edit field description


    dialogView?.addImage?.setOnClickListener {
        getPreviewImage.launch("image/*")
    }

    dialogView?.addVideo?.setOnClickListener {
        getPreviewVideo.launch("video/*")
    }

    dialogView?.addButton?.setOnClickListener {
        if (titleEditText?.text?.isEmpty() == true){
            Toast.makeText(applicationContext, "add required data", Toast.LENGTH_SHORT).show()
        }else{
            Toast.makeText(applicationContext, "Added", Toast.LENGTH_SHORT).show()
        }
    }
    dialog.setContentView(dialogView!!)
    dialog.show()
  }
}