如何从Base Activity为不同Activity的Toolbar设置不同标题
解决Toolbar标题无法按Activity设置的问题
首先咱们先揪出核心原因:当你在BaseActivity中调用setSupportActionBar(toolbar)后,系统会把Toolbar作为ActionBar的载体,这时候直接调用toolbar.setTitle()大概率不会生效——因为ActionBar会接管标题的显示逻辑。下面给你几个实用的解决办法:
方法一:通过ActionBar统一设置标题
这是最稳妥的方案,适配官方的ActionBar逻辑。你可以在BaseActivity里封装一个设置标题的方法,让所有子Activity直接调用:
// 在BaseActivity中添加这个方法 protected void setToolbarTitle(String title) { if (getSupportActionBar() != null) { getSupportActionBar().setTitle(title); } }
然后在子Activity的onCreate里调用就行:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_home); // 设置当前Activity的标题 setToolbarTitle("首页"); }
要是不想封装方法,子Activity也可以直接操作ActionBar:
if (getSupportActionBar() != null) { getSupportActionBar().setTitle("我的个人中心"); }
方法二:让Toolbar直接掌控标题显示
如果你更习惯直接用toolbar.setTitle(),可以在BaseActivity初始化时,禁用ActionBar对标题的接管:
// BaseActivity中初始化Toolbar的代码调整 setSupportActionBar(toolbar); if (getSupportActionBar() != null) { // 隐藏ActionBar自带的标题栏,这样toolbar.setTitle()就会生效 getSupportActionBar().setDisplayShowTitleEnabled(false); }
之后不管是BaseActivity还是子Activity,直接调用toolbar.setTitle("自定义标题")就能生效了。
方法三:检查代码执行顺序
一定要确保设置标题的代码是在setSupportActionBar(toolbar)之后执行的!比如子Activity不能在调用super.onCreate(savedInstanceState)之前就尝试设置标题——这时候Toolbar还没和ActionBar绑定完成,肯定不会生效。
最后给你补一个完整的BaseActivity示例,方便你参考:
public class BaseActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { protected Toolbar toolbar; protected DrawerLayout drawer; protected NavigationView navigationView; protected ActionBarDrawerToggle toggle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_base); // 初始化Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); // 初始化侧边栏 drawer = findViewById(R.id.drawer_layout); navigationView = findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.addDrawerListener(toggle); toggle.syncState(); // 设置侧边栏头部用户名 View headerView = navigationView.getHeaderView(0); TextView usernameTv = headerView.findViewById(R.id.headerName); usernameTv.setText("你的用户名"); navigationView.setItemIconTintList(null); } @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { // 侧边栏跳转逻辑 int id = item.getItemId(); if (id == R.id.nav_home) { startActivity(new Intent(this, HomeActivity.class)); } else if (id == R.id.nav_profile) { startActivity(new Intent(this, ProfileActivity.class)); } drawer.closeDrawer(GravityCompat.START); return true; } // 给子Activity提供的标题设置方法 protected void setToolbarTitle(String title) { if (getSupportActionBar() != null) { getSupportActionBar().setTitle(title); } } }
内容的提问来源于stack exchange,提问作者Tahreem
相关产品推荐
相关产品推荐

