You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击Dialog按钮触发Activity中好友请求函数的实现方案

问题解决方案

核心问题分析

  1. 原代码将当前用户ID传递给FriendDialog,而非发现的设备UUID,导致无法正确获取目标用户信息
  2. setFriend逻辑错误地放在onScanResult中,依赖无效的intent参数触发,无法响应Dialog按钮点击
  3. getFriendName函数嵌套在onScanResult内部,无法在Dialog回调中调用
  4. UUID未正确转换为字符串格式传递

步骤1:修改FriendDialog.kt

让Dialog接收目标用户UUID和点击回调,将网络逻辑剥离到Activity中处理:

import android.graphics.Color
import android.graphics.drawable.ColorDrawable
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.DialogFragment
import com.example.marsproject.databinding.ActivityFriendDialogBinding

class FriendDialog(
    private val friendUuid: String,
    private val onAddFriendClicked: () -> Unit
) : DialogFragment() {

    private lateinit var binding: ActivityFriendDialogBinding

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = ActivityFriendDialogBinding.inflate(inflater, container, false)
        val view = binding.root

        dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT))

        // 绑定添加好友按钮点击事件,触发传入的回调
        binding.addFriendBtn.setOnClickListener {
            onAddFriendClicked.invoke()
            dismiss() // 点击后关闭Dialog
        }

        binding.finishBtn.setOnClickListener {
            dismiss()
        }
        return view
    }
}

步骤2:修改SearchPeopleActivity.kt

修正UUID传递逻辑,将setFriend逻辑绑定到Dialog的回调中,并优化重复用户过滤:

// ... 保留原有导入 ...

@SuppressLint("MissingPermission")
class SearchPeopleActivity : AppCompatActivity() {
    // ... 保留原有成员变量 ...

    // 将getFriendName改为可复用函数,接收UUID参数
    private fun getFriendName(friendUuid: String): String {
        var friendName = ""
        try {
            val jsonObject = Request().reqget("http://dmumars.kro.kr/api/getbtuserdata/${friendUuid}")
            friendName = jsonObject.getString("user_name")
        } catch (e: UnknownServiceException) {
            Log.d("bluetooth", "this uuid user is not in our App")
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return friendName
    }

    val bluetoothSearchCallback = object : ScanCallback() {
        private val isdup = ArrayList<String>() 

        override fun onScanResult(callbackType: Int, result: ScanResult?) {
            super.onScanResult(callbackType, result)

            // 提取并转换UUID为字符串,空值则直接返回
            val deviceuuid = result?.scanRecord?.serviceUuids?.get(0)?.toString() ?: return
            // 过滤重复用户
            if (isdup.contains(deviceuuid)) return
            isdup.add(deviceuuid)

            Thread{
                runOnUiThread {
                    findUser = binding.friend1
                    findUser.startAnimation(fadeInAnimation)

                    val screenWidth = 409
                    val screenHeight = 673

                    val randomX = (0..screenWidth).random()
                    val randomY = (0..screenHeight).random()

                    findUser.x = randomX.toFloat()
                    findUser.y = randomY.toFloat()

                    findUser.visibility = ImageView.VISIBLE

                    findUser.setOnClickListener{
                        UserApiClient.instance.me { user, error ->
                            if(user != null){
                                // 创建Dialog时传入目标UUID和添加好友的回调逻辑
                                val dialog = FriendDialog(deviceuuid) {
                                    Thread {
                                        try {
                                            val userName = getName()
                                            val friendName = getFriendName(deviceuuid)

                                            val jsonObject = JSONObject()
                                            jsonObject.put("user_name", userName)
                                            jsonObject.put("friend", friendName)
                                            Request().reqpost("http://dmumars.kro.kr/api/setfriend", jsonObject)

                                            // 在UI线程显示成功提示
                                            runOnUiThread {
                                                Toast.makeText(this@SearchPeopleActivity, "好友请求已发送", Toast.LENGTH_SHORT).show()
                                            }
                                        } catch (e: UnknownServiceException) {
                                            runOnUiThread {
                                                Toast.makeText(this@SearchPeopleActivity, "该用户未注册本应用", Toast.LENGTH_SHORT).show()
                                            }
                                        } catch (e: Exception) {
                                            e.printStackTrace()
                                            runOnUiThread {
                                                Toast.makeText(this@SearchPeopleActivity, "发送请求失败", Toast.LENGTH_SHORT).show()
                                            }
                                        }
                                    }.start()
                                }
                                dialog.isCancelable = false
                                dialog.show(supportFragmentManager, "FriendDialog")
                            }
                        }
                    }
                }
            }.start()

            // 删除原有的无效intent判断代码块
        }
    }

    // ... 保留原有getName()和其他函数 ...
}

关键改进点

  1. 正确传递UUID:将扫描到的设备UUID转换为字符串后传入Dialog,确保能正确查询目标用户信息
  2. 回调解耦:Dialog仅负责UI交互,网络逻辑由Activity处理,符合单一职责原则
  3. 重复用户过滤:使用isdup列表避免重复显示同一用户
  4. 线程安全:网络请求在子线程执行,Toast提示切换回UI线程,避免ANR

内容的提问来源于stack exchange,提问作者Yoona

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 14:34:59