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
相关产品推荐
相关产品推荐

