【问题标题】:Image Isn't upating when going back to main activity返回主要活动时图像未更新
【发布时间】:2020-03-07 15:15:28
【问题描述】:

好的,我有两个活动,在主活动中有一个图片按钮,可将您带到个人资料页面活动,您可以单击另一个图片按钮并访问您的照片库以设置已保存的个人资料图片进入 Firebase 存储并作为数据库中的 url。这一切都有效,问题是在您完成所有这些并返回主要活动(我正在覆盖后退按钮并开始新的主要活动)之后,尽管 Log.d 检查报告该图像按钮显示以前的配置文件图像我正在访问更新的网址。更奇怪的是,如果我再次进入个人资料活动,它将显示更新个人资料图片,当我再次返回主要活动时,新图像现在将正确显示。

主活动

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding = DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        binding.activity = this
        setSupportActionBar(toolbar)
        val emailer=intent.getStringExtra("passemail")

        val toggle = ActionBarDrawerToggle(
                this, drawer_layout, toolbar, R.string.main_drawer_open, R.string.main_drawer_close)
        drawer_layout.addDrawerListener(toggle)
        toggle.syncState()

        val profile = findViewById<de.hdodenhof.circleimageview.CircleImageView>(R.id.profilebutton)

        val ref = FirebaseDatabase.getInstance().getReference("/users/$emailer")

        val valueEventListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                val user = dataSnapshot.getValue(User::class.java)
                Log.d("msg0 main", "image url: " + user!!.profile_pic);

                if(user!!.profile_pic.length > 0){

                        Picasso.get().load(user!!.profile_pic).into(profile)
                }
            }
            override fun onCancelled(databaseError: DatabaseError) {
                Log.d("msg0", databaseError.message) //Don't ignore errors!
            }
        }
        ref.addListenerForSingleValueEvent(valueEventListener)

        profile.setOnClickListener {
            val intent = Intent(this, ProfilePage::class.java)
            intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
            intent.putExtra("passemail",emailer)
            startActivity(intent)
        }
    }
}

个人资料活动

class ProfilePage : AppCompatActivity() {

    private lateinit var auth: FirebaseAuth
    private lateinit var profilepic: de.hdodenhof.circleimageview.CircleImageView
    private lateinit var profileURi: Uri
    private lateinit var emailz: String

    private fun saveUserToDatabase(profilepicURL: String, emailer:String){

        val uid = FirebaseAuth.getInstance().uid ?: ""
        val ref = FirebaseDatabase.getInstance().getReference("/users/$emailer/profile_pic")
        ref.setValue(profilepicURL)
                .addOnSuccessListener {
                    Log.d("msg0", "saved pic to firebase database, $ref")

                }
                .addOnFailureListener{
                    Log.d("msg0", "failed to save pic into database, ${it.message}")
                }
    }

    private fun chooseImage() {
        val intent = Intent(Intent.ACTION_PICK)
        intent.type = MediaStore.Images.Media.CONTENT_TYPE
        startActivityForResult(intent, 10)
    }
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        val emailer=intent.getStringExtra("passemail")

        if (requestCode == 10 && resultCode == Activity.RESULT_OK && data != null) {

            profileURi = data.data
            val bitmap = MediaStore.Images.Media.getBitmap(contentResolver, profileURi)

            Log.d("msg0 profileuri", profileURi.toString());

            profilepic.setImageBitmap(bitmap)

            uploadImagetoFirebase(emailer);

        }
    }

    private fun uploadImagetoFirebase(emailer:String){

        if(profileURi == null) return
        val filename = UUID.randomUUID().toString()
        val ref = FirebaseStorage.getInstance().getReference("/images/$filename")
        ref.putFile(profileURi!!)
                .addOnSuccessListener {
                    Toast.makeText(this, "Successfully uploaded image ${it.metadata?.path}", Toast.LENGTH_SHORT).show()
                    Log.d("msg0 upload", "image url: " + it.metadata?.path);


                    ref.downloadUrl.addOnSuccessListener {
                        Log.d("msg1 upload", "image url: " + it);

                        Toast.makeText(this, "File Location $it", Toast.LENGTH_SHORT).show()
                        saveUserToDatabase(it.toString(),emailer)
                    }
                }
    }

    override fun onBackPressed() {

        val intent = Intent(this, MainActivity :: class.java)
        Log.d("checker2", emailz)
        intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
        intent.putExtra("passemail",emailz)
        startActivity(intent)
    }

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

        val emailer=intent.getStringExtra("passemail")
        // Initialize Firebase Auth
        auth = FirebaseAuth.getInstance()

        emailz = emailer

        //Create Image View and set it to call upload when clicked
        profilepic = findViewById<de.hdodenhof.circleimageview.CircleImageView>(R.id.img_profile)

        val uid = FirebaseAuth.getInstance().uid ?: ""
        val ref = FirebaseDatabase.getInstance().getReference("/users/$emailer")

        val valueEventListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {
                val user = dataSnapshot.getValue(User::class.java)
                Log.d("msg0 profile", "image url: " + user!!.profile_pic);

                if(user!!.profile_pic.length > 0){
                    Picasso.get().load(user!!.profile_pic).into(profilepic)
                }
            }
            override fun onCancelled(databaseError: DatabaseError) {
                Log.d("msg0", databaseError.message) //Don't ignore errors!
            }
        }
        ref.addListenerForSingleValueEvent(valueEventListener)

        profilepic.setOnClickListener(View.OnClickListener { chooseImage() })

    }
}

我正在为图像按钮使用一个库,但在我添加它之前就存在这个问题。

【问题讨论】:

    标签: android firebase kotlin android-imageview picasso


    【解决方案1】:

    你不需要开始一个新的MainActivity,因为

    如果您单击返回按钮,ProfilePage 将被销毁,您将看到MainActivity。

    如果您在MainActivity 中的ValueEventListener 有效,您将正确看到图片。

    希望有帮助

    【讨论】:

    • 我在尝试启动新的 MainActivity 之前遇到了这个问题。我想当我按下回键时,我被带到 MainActivity 之前的状态,这就是显示不正确图像的原因,所以我添加了 intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK) 以在移动到配置文件活动并开始新的活动时将其从堆栈中清除回到它的时候,这没有用。
    • @Gianni 你可以把你的 emailz 和 setResult 放在 ProfilePage 中,然后通过 onActivityResult 在 MainActivity 中获取 emailz
    猜你喜欢
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多