Изображение не обновляется при возвращении к основной деятельности - PullRequest
0 голосов
/ 12 ноября 2019

Хорошо, у меня есть два действия, в основном упражнении есть кнопка с изображением, которая переводит вас на страницу профиля, где вы можете нажать на кнопку другого изображения и получить доступ к своей фотогалерее, чтобы установить изображение профиля, которое будет сохранено. в хранилище Firebase и в качестве URL-адреса в базе данных. Это все работает, проблема в том, что после того, как вы все это сделаете и вернетесь к основному действию (я переопределяю кнопку «Назад» и запускаю новое основное действие), кнопка «Изображение» показывает предыдущее изображение профиля, несмотря на то, что Log.d проверяет, чтоЯ получаю доступ к обновленному URL. Даже странно, что если я снова зайду в профиль, на нем отобразится изображение профиля обновления, а когда я снова вернусь к основному виду деятельности, новое изображение теперь будет отображаться правильно.

MainActivity

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)
        }
    }
}

ProfileActivity

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() })

    }
}

Я использую библиотеку для кнопок изображений, но эта проблема существовала до того, как я ее добавил.

1 Ответ

0 голосов
/ 12 ноября 2019

Вам не нужно начинать новый MainActivity, потому что

, если вы нажмете кнопку возврата, ProfilePage будет уничтожить , и вы увидите MainActivity.

Если вы ValueEventListener в MainActivity работаете, вы увидите картинку правильно.

Надеюсь, эта помощь

...