【问题标题】:Upload image to one of 3 separate ImageViews, after clicking one of 3 buttons单击 3 个按钮之一后,将图像上传到 3 个单独的 ImageView 之一
【发布时间】:2021-12-03 06:26:11
【问题描述】:

我有一个活动,您可以在单击 3 个不同按钮中的一个后上传 3 张不同的图片。您只能一张一张选择图像,而不是一次选择 3 张。每个“按钮”实际上是一个clickableImageView,当点击它时应该提示用户选择一张图片,然后他们选择的图片应该填充他们点击的ImageView。我知道如何在每个活动中只使用 1 个 imageView,所以我目前陷入困境。

我的思考过程如下:

  1. 有 3 个不同的 Boolean 变量链接到 3 个不同的 clickable ImageViews

     private var clickedView1: Boolean = false
     //same for the other views
    
  2. 当点击 1 个视图 (OnClickListeners) 时,切换与其链接的 Boolean,使其为真。

     upload1.setOnClickListener {
         clickedView1 = true
         uploadPicture()
     }
     //same for the other views
    
  3. 如果布尔值更新为 true,则填充相应的 imageView(在 onActivityResult 中完成)。

         if (clickedView1) {
             if (requestCode == 0 && resultCode == Activity.RESULT_OK && data != null) {
    
             selectedPhotoUri1 = data.data
             ImagesList?.plus(selectedPhotoUri1)
             val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, selectedPhotoUri1)
             upload1.setImageBitmap(bitmap)
             }
         } else if { 
             //same thing for the other views
         }
    

在我看来这是有道理的,但我知道这是错误的,当我对其进行编程并启动活动时,我必须按照我填充图像视图的顺序进行战略性 RE(即它仅适用于最后一个 ImageView,去第一个)。任何其他命令都不起作用,并且将始终填充第一个 ImageView,无论单击哪个。

有没有一种高效准确的方法来做人口+OnClickListeners

【问题讨论】:

  • 所以问题是你的图片总是上传到第一个ImageView,不管点击哪个?
  • 是的,这就是@alexal1 的问题,除非我从最后一个到第一个而不是按任何其他顺序选择

标签: java android kotlin


【解决方案1】:

Android 很可能会在您选择图像时重新创建您的 Activity。您没有提供 uploadPicture() 方法的代码,但我想它会在另一个应用程序中打开图像选择器。因此,您的变量值可能会丢失,包括clickedView1 等。您可以通过在onActivityResult() 中输入日志来检查它,其中显示了这些变量的值。

如果我是对的,那么一种可能的解决方案是将变量的值保存在 onSaveInstanceState() 中并将它们恢复到 onCreate() 中,如下所示:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    clickedView1 = savedInstanceState?.getBoolean(KEY_CLICKED_VIEW_1)
}

override fun onSaveInstanceState(outState: Bundle?) {
    outState?.putBoolean(KEY_CLICKED_VIEW_1, clickedView1)
    super.onSaveInstanceState(outState)
}

对于未来的改进,您也可以考虑

  • 使用一个 int 而不是三个 Booleans 来记住选择的 ImageView
  • 在选择图像而不是保存状态时,对不同的 ImageView 使用不同的请求代码。

【讨论】:

  • 我使用了日志语句,我想我可能已经找到了问题所在。其他的布尔变量(即当时未点击的变量)保持为true。我已经更改了这一点,以便在单击视图时,只有与其对应的布尔值更新为true,其他的更新为false。不幸的是,这不起作用,因为它现在将所有内容都保留为false,但我有一种感觉,那就是问题所在。我在SetOnClickListener 中进行了更新,只需将false 分配给与未点击的布尔值相对应的其他2 个布尔值。
  • 你是对的uploadPicture(),它所做的只是打开图像选择器。
  • 在图库中旋转屏幕时不要忘记测试案例。如果它们没有像答案中那样保存,它将重置所有变量。
  • 我的错,请忘记第一条评论,它现在有效(:感谢使用 Log 语句的建议。我总是低估它们的用处。我会添加一个答案。
【解决方案2】:

这是解决方案:(我只能在 2 天内将其标记为正确)

按照我在问题中详述的解释,我所做的唯一一件事就是将未单击图像视图时的布尔变量更新为false,否则,每当您单击它一次时,它都会保留该变量确实如此,我猜这会导致混淆应该填充哪个视图。

【讨论】:

    猜你喜欢
    • 2015-07-23
    • 2022-10-15
    • 2015-10-18
    • 1970-01-01
    • 2014-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多