【问题标题】:I need to update my DrawerLayout from fragment on Kotlin我需要从 Kotlin 上的片段更新我的 DrawerLayout
【发布时间】:2021-05-17 20:46:43
【问题描述】:

我的 MainActivity 上有一个功能可以从 Firestore 加载用户数据以更新抽屉上的图像,但它仅在我重新启动应用程序时更新,当我更新配置文件片段上的用户详细信息时,详细信息是在 Firebase 上更新,但不在我的抽屉上。我怎样才能改变这个?我正在使用的教程在不同的活动中做所有事情。

以下是我在主要活动上的功能和 FirestoreClass 上的方法

class MainActivity : AppCompatActivity() {
 
override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val toolbar: Toolbar = findViewById(R.id.toolbar)
        setSupportActionBar(toolbar)

        FirestoreClass().loadUserData(this)

   fun updateNavigationUserDetails(user: User){

        val ivDrawerImage : ImageView = findViewById(R.id.iv_drawer)

        Glide
            .with(this)
            .load(user.image)
            .centerCrop()
            .placeholder(R.drawable.ic_user_place_holder)
            .into(ivDrawerImage)

        val userName : TextView = findViewById(R.id.tv_drawer)
        userName.text = user.name
        val userEmail : TextView = findViewById(R.id.tv_email_drawer)
        userEmail.text = user.email
    }
}
class FirestoreClass {


    fun loadUserDataOnProfile(fragment: Fragment) {
        firestore.collection(Constants.USERS)
            .document(getCurrentUserID())
            .get()
            .addOnSuccessListener { document ->
                val loggedUser = document.toObject(User::class.java)

                when(fragment) {
                    is ProfileFragment -> {
                        fragment.setUserDataInUI(loggedUser!!)
                     }
                }
            }
            .addOnFailureListener { e ->
                Log.e("TAG", "Error ssssss", e)

            }
    }

    fun loadUserData(activity: Activity) {
        firestore.collection(Constants.USERS)
            .document(getCurrentUserID())
            .get()
            .addOnSuccessListener { document ->
                val loggedUser = document.toObject(User::class.java)

                when (activity) {
                    is SignInActivity -> {
                        activity.signInSuccess(loggedUser!!)
                    }
                    is MainActivity -> {
                        activity.updateNavigationUserDetails(loggedUser!!)
                    }
                }
            }
            .addOnFailureListener { e ->
                Log.e("TAG", "Error signing in", e)

            }
    }
class ProfileFragment : Fragment() {

val btnUpdate: Button = view.findViewById(R.id.btn_update)
        btnUpdate.setOnClickListener {
            if(selectedImageUri != null){
                uploadUserImage()
            } else {
                updateUserProfileData()
            }
            findNavController().navigate(R.id.action_nav_my_profile_to_nav_home)
        }

当我按下 profileFragment 上的 updateButton 时,我想调用 MainActivity 上的 updateNavigationUserDetails()。我该怎么做?

【问题讨论】:

    标签: android firebase kotlin android-fragments


    【解决方案1】:

    首先你应该创建一个NavigationUpdaterListener 接口:

    interface NavigationUpdaterListener {
        fun onUserDataChanged()
    }
    

    那么你应该让你的MainActivity 实现这个接口:

    class MainActivity : AppCompatActivity(), NavigationUpdaterListener {
     
       fun updateNavigationUserDetails(user: User){
    
            val ivDrawerImage : ImageView = findViewById(R.id.iv_drawer)
    
            Glide
                .with(this)
                .load(user.image)
                .centerCrop()
                .placeholder(R.drawable.ic_user_place_holder)
                .into(ivDrawerImage)
    
            val userName : TextView = findViewById(R.id.tv_drawer)
            userName.text = user.name
            val userEmail : TextView = findViewById(R.id.tv_email_drawer)
            userEmail.text = user.email
        }
    
        override fun onUserDataChanged() {
            updateNavigationUserDetails()
        }
    }
    

    然后你可以像这样从ProfileFragment 调用监听器:

    (requireActivity() as NavigationUpdaterListener).onUserDataChanged()
    

    【讨论】:

    • 但是如何让用户在 onUserDataChanged() 中调用 updateNavigationUserDetails()?我从 FirestoreClass 调用 loadUserData 更新了 MainActivity
    【解决方案2】:

    更新:

    更新用户数据的部分,例如:

    mFirebaseFirestore
      .collection("users")
      .document(mFirebaseAuth.getUid())
      .update(userMap)
      .addOnSuccessListener { document->
         Log.d(TAG, "DocumentSnapshot successfully updated!")
         val user = document.toObject(User::class.java)
         //Can be called here
         updateNavigationUserDetails(user)
          }
      .addOnFailureListener {
         Log.d(TAG, "DocumentSnapshot failed to update!") }
    

    【讨论】:

    • 我尝试了两种方法,但我不知道如何让参数传递给他们
    • 检查更新的答案。希望有帮助!
    • 如果还没有,请查看更新后的答案。
    • 对不起,回答迟了,我在这方面浪费了很多时间,决定继续前进,稍后再接。我尝试了更新的方法。在firestore上的.update()中,我不能调用document.toObject(),显然只能在.get()中。我尝试在 addOnSuccessListener 中嵌套一个新的 firestore.collection.document.get 但它也没有工作
    • 哦!数据更新时必须有一些事件触发器吗?检查this
    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多