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

传递Options Bundle启动Activity引发目标Activity状态异常的问题咨询

问题:使用ActivityOptions启动Activity后,SearchView状态恢复异常

代码示例

MainActivity代码

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val button = findViewById<Button>(R.id.button)

        button.setOnClickListener {
            val options = ActivityOptions.makeSceneTransitionAnimation(
                this,
                button,"animation"
            ).toBundle()

            val intent = Intent(this, SearchActivity::class.java)
            startActivity(intent, options)
        }
    }
}

SearchActivity代码

class SearchActivity: AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_search)

        val button = findViewById<Button>(R.id.button)
        val search = findViewById<SearchView>(R.id.search)

        search.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String): Boolean {
                return true
            }

            override fun onQueryTextChange(query: String): Boolean {
                if (query.isNotEmpty()) {
                    button.visibility = View.GONE
                } else {
                    button.visibility = View.VISIBLE
                }
                return true
            }
        })
    }
}

问题现象

当SearchView有输入内容时,按钮会被隐藏。但首次输入内容后锁屏再解锁(SearchActivity恢复),按钮会重新显示;再次输入内容并锁屏解锁后,按钮状态才符合预期。

该问题仅在启动Activity时传入ActivityOptions的Bundle时出现,直接调用startActivity(intent)则无异常。

原因分析

使用场景过渡动画(Scene Transition Animation)启动Activity时,系统的视图状态恢复逻辑与普通启动存在差异。首次恢复Activity时,系统会优先恢复视图的初始可见性状态,而没有同步触发SearchView的文本状态检查,导致onQueryTextChange方法未被调用,按钮状态没有得到正确更新。

解决方案

方法1:在onRestoreInstanceState中同步状态

重写SearchActivity的onRestoreInstanceState方法,手动根据SearchView当前的文本内容更新按钮可见性,确保状态恢复时同步:

class SearchActivity: AppCompatActivity() {
    private lateinit var button: Button
    private lateinit var search: SearchView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_search)

        button = findViewById(R.id.button)
        search = findViewById(R.id.search)

        search.setOnQueryTextListener(object : SearchView.OnQueryTextListener {
            override fun onQueryTextSubmit(query: String): Boolean {
                return true
            }

            override fun onQueryTextChange(query: String): Boolean {
                updateButtonVisibility(query)
                return true
            }
        })
    }

    override fun onRestoreInstanceState(savedInstanceState: Bundle) {
        super.onRestoreInstanceState(savedInstanceState)
        // 恢复时根据当前搜索文本更新按钮状态
        updateButtonVisibility(search.query.toString())
    }

    private fun updateButtonVisibility(query: String) {
        button.visibility = if (query.isNotEmpty()) View.GONE else View.VISIBLE
    }
}

方法2:在onResume中检查更新

如果onRestoreInstanceState不生效,也可以在onResume方法中执行状态检查:

override fun onResume() {
    super.onResume()
    updateButtonVisibility(search.query.toString())
}

补充说明

已在Google Issue Tracker提交该问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:55:24