点击Dialog按钮触发Activity中好友请求函数的实现方案
问题解决方案
核心问题分析
- 原代码将当前用户ID传递给
FriendDialog,而非发现的设备UUID,导致无法正确获取目标用户信息 setFriend逻辑错误地放在onScanResult中,依赖无效的intent参数触发,无法响应Dialog按钮点击getFriendName函数嵌套在onScanResult内部,无法在Dialog回调中调用- 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()和其他函数 ... }
关键改进点
- 正确传递UUID:将扫描到的设备UUID转换为字符串后传入Dialog,确保能正确查询目标用户信息
- 回调解耦:Dialog仅负责UI交互,网络逻辑由Activity处理,符合单一职责原则
- 重复用户过滤:使用
isdup列表避免重复显示同一用户 - 线程安全:网络请求在子线程执行,Toast提示切换回UI线程,避免ANR
内容的提问来源于stack exchange,提问作者Yoona
相关产品推荐
相关产品推荐

