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

Android中如何将HomeActivity的searchText变量传递到其他类?

问题描述

我在HomeActivity中定义了var searchText = et_search_field?.text?.toString(),需要将该searchText传入链接"https://t.supersimplesearch1.com/searchm?q=$searchText&n=9250",但无法在其他类中调用该变量,即使将其全局化也无法解决问题。

以下是HomeActivity中的onSearchClicked()方法代码:

private fun onSearchClicked() {
    val searchText = et_search_field?.text?.toString()

    if (!searchText.isNullOrEmpty()) {
        if (searchText.contains(".") && !searchText.contains(" ")) {
            requestToWeb =
                if (searchText.startsWith("http://") ||
                    searchText.startsWith("https://"))
                    searchText
                else "http://$searchText"

            createHttpTask(requestToWeb!!)
                .addOnSuccessListener {
                    isSiteAvailability = true
                    startActivity(
                        BrowserActivity.newIntent(
                            this,
                            requestToWeb,
                            isSiteAvailability = isSiteAvailability
                        )
                    )
                }
                .addOnFailureListener {
                    requestToWeb = requestToWeb!!.replace("http://", "")
                    isSiteAvailability = false
                    if (it.message == "Error: 301") {
                        requestToWeb = "https://$requestToWeb"
                        createHttpTask(requestToWeb!!)
                            .addOnSuccessListener {
                                isSiteAvailability = true
                                startActivity(
                                    BrowserActivity.newIntent(
                                        this,
                                        requestToWeb,
                                        isSiteAvailability = isSiteAvailability
                                    )
                                )

                            }
                            .addOnFailureListener {
                                requestToWeb = requestToWeb!!.replace("https://", "")
                                isSiteAvailability = false
                                startActivity(
                                    BrowserActivity.newIntent(
                                        this,
                                        requestToWeb,
                                        isSiteAvailability = isSiteAvailability
                                    )
                                )
                            }

                    } else {
                        startActivity(
                            BrowserActivity.newIntent(
                                this,
                                requestToWeb,
                                isSiteAvailability = isSiteAvailability
                            )
                        )
                    }
                }
        } else {
            isSiteAvailability = false
            requestToWeb = searchText
            startActivity(
                BrowserActivity.newIntent(
                    this,
                    requestToWeb,
                    isSiteAvailability = isSiteAvailability
                )
            )
        }
    } else {
        Toast.makeText(this, getString(R.string.search_empty_error), Toast.LENGTH_SHORT).show()
    }
}
解决方案

1. 直接传递参数(推荐)

不要依赖全局变量,在跳转或调用其他类时直接把searchText作为参数传入,避免内存泄漏和生命周期问题。

步骤1:修改BrowserActivity的newIntent方法

class BrowserActivity : AppCompatActivity() {
    companion object {
        private const val EXTRA_REQUEST_WEB = "extra_request_web"
        private const val EXTRA_SITE_AVAILABILITY = "extra_site_availability"
        private const val EXTRA_SEARCH_TEXT = "extra_search_text"

        fun newIntent(
            context: Context,
            requestToWeb: String?,
            isSiteAvailability: Boolean,
            searchText: String?
        ): Intent {
            return Intent(context, BrowserActivity::class.java).apply {
                putExtra(EXTRA_REQUEST_WEB, requestToWeb)
                putExtra(EXTRA_SITE_AVAILABILITY, isSiteAvailability)
                putExtra(EXTRA_SEARCH_TEXT, searchText)
            }
        }
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        // 获取传入的searchText并拼接链接
        val searchText = intent.getStringExtra(EXTRA_SEARCH_TEXT)
        val targetUrl = "https://t.supersimplesearch1.com/searchm?q=$searchText&n=9250"
        // 后续使用targetUrl即可
    }
}

步骤2:在HomeActivity跳转时传入参数

在onSearchClicked方法的所有startActivity调用处,添加searchText参数:

// 示例:在else分支中修改
startActivity(
    BrowserActivity.newIntent(
        this,
        requestToWeb,
        isSiteAvailability = isSiteAvailability,
        searchText = searchText
    )
)

2. 正确实现全局变量(若必须使用)

如果一定要用全局变量,需确保变量的作用域和生命周期正确:

方式A:类成员变量(不推荐跨类直接访问)

在HomeActivity中定义可访问的成员变量:

class HomeActivity : AppCompatActivity() {
    // 定义为类级别的可空变量
    var searchText: String? = null

    private fun onSearchClicked() {
        // 给全局变量赋值
        searchText = et_search_field?.text?.toString()
        // ... 原有代码
    }
}

注意:其他类直接访问该变量需持有HomeActivity实例,容易引发内存泄漏,不建议使用。

方式B:单例存储类(更安全的全局方案)

创建独立的单例类存储搜索文本:

object SearchDataHolder {
    var searchText: String? = null
}

在HomeActivity中赋值:

private fun onSearchClicked() {
    val searchText = et_search_field?.text?.toString()
    SearchDataHolder.searchText = searchText
    // ... 原有代码
}

其他类直接调用SearchDataHolder.searchText即可,注意处理空值情况。

3. 排查全局化失败的常见原因

如果已经尝试全局化但无法访问,检查以下点:

  • 变量是否被private修饰,需去掉该修饰符
  • 变量是否是方法内的局部变量,需移到类成员位置
  • 访问时HomeActivity实例是否已被销毁,导致变量为空

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 04:15:42