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

