Android Java开发:DataActivity返回后ActionBar标题消失的解决办法
解决DataActivity返回后ActionBar标题为空的问题
你的问题出在仅在onCreate方法中设置标题,当从其他页面返回DataActivity时,onCreate不会重新执行;若tableName变量因内存回收或其他原因变为空,就会导致标题丢失。以下是几种可行的解决方案:
方案1:在onResume中重新设置标题
每次回到DataActivity时,onResume方法都会被调用,在这里重新获取并设置标题,能确保标题始终正确:
private String tableName; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_data); initTableName(); setTitle(tableName); } @Override protected void onResume() { super.onResume(); initTableName(); setTitle(tableName); } private void initTableName() { Intent intent = getIntent(); if (intent != null) { tableName = intent.getStringExtra("tableName"); // 兜底处理,避免空标题 if (tableName == null) { tableName = "数据列表"; } } }
方案2:保存状态到savedInstanceState
当系统因内存不足销毁DataActivity,返回时会重建Activity,通过保存tableName到状态中,能避免重建时丢失数据:
private String tableName; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_data); if (savedInstanceState != null) { // 从保存的状态恢复tableName tableName = savedInstanceState.getString("tableName"); } else { // 首次创建从Intent获取 Intent intent = getIntent(); if (intent != null) { tableName = intent.getStringExtra("tableName"); } } // 兜底处理 if (tableName == null) { tableName = "数据列表"; } setTitle(tableName); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); // 保存tableName到状态 outState.putString("tableName", tableName); }
方案3:使用ViewModel(推荐,适合复杂场景)
如果你的项目使用Jetpack组件,可以用ViewModel存储tableName,它的生命周期独立于Activity的销毁重建,能更稳定地保存数据:
// 定义ViewModel public class DataViewModel extends ViewModel { private String tableName; public String getTableName() { return tableName; } public void setTableName(String tableName) { this.tableName = tableName; } } // DataActivity中使用 private DataViewModel viewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_data); viewModel = new ViewModelProvider(this).get(DataViewModel.class); if (viewModel.getTableName() == null) { // 首次获取 Intent intent = getIntent(); if (intent != null) { String name = intent.getStringExtra("tableName"); viewModel.setTableName(name != null ? name : "数据列表"); } } setTitle(viewModel.getTableName()); } @Override protected void onResume() { super.onResume(); setTitle(viewModel.getTableName()); }
内容的提问来源于stack exchange,提问作者Feras
相关产品推荐
相关产品推荐

