如何在 Kotlin 中对多个函数使用相同的 setOnClickListener?

How to use same setOnClickListener for mutliple functions in Kotlin?

我有这个 setOnClickListener,它首先检查用户是否登录,然后如果用户登录,运行 函数如下:

like.setOnClickListener {
            val sharedPreference2 = context?.getSharedPreferences("isLogin", Context.MODE_PRIVATE)
            val fbtoken = sharedPreference2?.getString("UserToken", "false")
            if(fbtoken.equals("false"))
            {
                val builder = AlertDialog.Builder(context).create()
                val optionDialog = AlertDialog.Builder(context)
                val layoutInflator = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater
                val dialogView = layoutInflator.inflate(R.layout.alert_reg, null)
                val goreg = dialogView.findViewById<TextView>(R.id.confirmation_reg)
                val cancel = dialogView.findViewById<TextView>(R.id.cancel_reg)
                builder.setCancelable(false)
                builder.setView(dialogView)


                goreg?.setOnClickListener {
                    val intent = Intent(context, SignupActivity::class.java)
                    intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
                    context.startActivity(intent)
                }


                cancel?.setOnClickListener {

                    builder.dismiss()

                }



                builder.show()

            }
            else
            {
                postLike(position, it.context)
                like.setImageResource(R.drawable.liked)
            }

        }

所以这个 setOnClickListener 首先会检查登录,然后在“其他”中 post 在 API。

我正在尝试使用与上面相同的 setOnClickListener,如果用户再次单击,它将从 API

中删除

我尝试将“else”替换为“if”和“else”,如下面的代码所示:

if (fbtoken.equals("true")){
                postLike(position, it.context)
                like.setImageResource(R.drawable.liked)
            }else{
                like.setImageResource(R.drawable.like)
                deleteLike(position, it.context)
            }

但现在它只从 API 中删除了它

有点像IG点赞按钮,第一次点击会post类似,再点击会删除

我做错了什么?

您没有更改保存在首选项中的值。您需要在单击按钮时将值更新为 true false

if (fbtoken.equals("true")){
   postLike(position, it.context)
   like.setImageResource(R.drawable.liked)
   fbtoken = sharedPreference2?.putString("UserToken", "false")
}else{
   like.setImageResource(R.drawable.like)
   deleteLike(position, it.context)
   fbtoken = sharedPreference2?.putString("UserToken", "true")
}

正确的方法是,不要在每次用户单击图像时都调用 setImageResouce,而是让选择器有两种状态,就像这样

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/ic_address_item_bg"android:state_selected="false"/>
 <item android:drawable="@drawable/ic_selected_address_bg"  
    android:state_selected="true"/>
 <item android:drawable="@drawable/ic_selected_address_bg"  />

 </selector>

您应该将此 xml 设置为图像视图或其他视图的 src 参数。

之后你应该根据用户操作分别改变视图状态

 likeButton.setonCLickListener {
  it.isSelected = !it.isSelected
    if (it.isSelected) {
       postLike()
} else {
       postUnlike()
} 

}