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

Kotlin技术问询:如何仅在toolbar3中显示选项菜单

问题原因

你当前的核心问题是:只有初始设置的toolbar被绑定到了SupportActionBar,系统只会将菜单渲染到这个默认关联的Toolbar上。切换toolbar2/toolbar3时仅修改了可见性,但没有重新将它们设置为当前的SupportActionBar,也没有根据当前Toolbar动态控制菜单的显示逻辑。

解决方案

1. 规范Toolbar变量为类成员

将三个Toolbar升级为MainActivity的类级变量,避免局部变量的访问限制,同时方便后续统一操作:

class MainActivity : AppCompatActivity() {
    lateinit var binding: ActivityMainBinding
    private val fl: FrameLayout by lazy { findViewById(R.id.main_frm) }
    private var backPressedTime: Long = 0
    
    // 改为类成员变量
    private lateinit var toolbar: Toolbar
    private lateinit var toolbar2: Toolbar
    private lateinit var toolbar3: Toolbar

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

        // 初始化Toolbar实例
        toolbar = findViewById(R.id.toolbar)
        toolbar2 = findViewById(R.id.toolbar2)
        toolbar3 = findViewById(R.id.toolbar3)

        // 设置默认Toolbar为ActionBar
        setSupportActionBar(toolbar)
        supportActionBar?.setDisplayShowTitleEnabled(false)

        // 剩余原有代码...
    }
}

2. 切换Toolbar时同步更新SupportActionBar

每次切换Toolbar时,除了修改可见性,必须调用setSupportActionBar()将当前Toolbar设为系统ActionBar,并强制刷新菜单:

(1)切换到toolbar2(进入NoticeFragment)

修改noticeitem的点击事件:

noticeitem.setOnClickListener{
    supportFragmentManager.beginTransaction()
        .replace(R.id.main_frm, NoticeFragment())
        .addToBackStack(null)
        .commit()
    
    // 切换Toolbar并更新ActionBar
    toolbar.visibility = View.INVISIBLE
    toolbar2.visibility = View.VISIBLE
    toolbar3.visibility = View.INVISIBLE
    setSupportActionBar(toolbar2)
    supportActionBar?.setDisplayShowTitleEnabled(false)
    invalidateOptionsMenu() // 强制触发菜单重建
}

(2)切换到toolbar3(进入CommunityItemFragment)

不要在Adapter中直接操作Activity控件,改用接口回调更符合架构规范:

  • 给NaviCommunityAdapter添加回调:
class NaviCommunityAdapter(private val onItemClick: () -> Unit) : RecyclerView.Adapter<NaviCommunityViewHolder>() {
    // ...原有代码
    override fun onBindViewHolder(holder: NaviCommunityViewHolder, position: Int) {
        holder.title.text = itemList[position].title
        holder.nickname.text = itemList[position].nickname
        
        holder.itemView.setOnClickListener {
            onItemClick.invoke()
        }
    }
}
  • 在NaviCommunityFragment中初始化Adapter时传入回调:
// 按你的实际Adapter初始化逻辑调整
val adapter = NaviCommunityAdapter {
    parentFragmentManager.beginTransaction()
        .replace(R.id.main_frm, CommunityItemFragment())
        .addToBackStack(null)
        .commit()
    // 调用Activity的Toolbar切换方法
    (activity as MainActivity).switchToToolbar3()
}
  • 在MainActivity中添加切换到toolbar3的方法:
fun switchToToolbar3() {
    toolbar.visibility = View.INVISIBLE
    toolbar3.visibility = View.VISIBLE
    setSupportActionBar(toolbar3)
    supportActionBar?.setDisplayShowTitleEnabled(false)
    invalidateOptionsMenu()
}

(3)返回时切换回默认Toolbar

统一处理返回逻辑,回到默认Toolbar并更新ActionBar:

// 封装默认Toolbar切换逻辑
private fun switchToDefaultToolbar() {
    toolbar.visibility = View.VISIBLE
    toolbar2.visibility = View.INVISIBLE
    toolbar3.visibility = View.INVISIBLE
    setSupportActionBar(toolbar)
    supportActionBar?.setDisplayShowTitleEnabled(false)
    invalidateOptionsMenu()
}

// 修改close_notice点击事件
close_notice.setOnClickListener {
    supportFragmentManager.popBackStack()
    switchToDefaultToolbar()
}

// 修改btn_back点击事件
btn_back.setOnClickListener {
    supportFragmentManager.popBackStack()
    switchToDefaultToolbar()
}

// 底部导航切换时也回到默认Toolbar
main_bnv.setOnItemSelectedListener { item ->
    switchToDefaultToolbar() // 添加该行
    changeFragment(
        // ...原有代码
    )
    true
}

3. 动态控制菜单显示

修改onCreateOptionsMenu,仅在当前Toolbar为toolbar3时加载菜单:

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menu?.clear() // 先清空原有菜单
    // 判断当前ActionBar关联的Toolbar是否为toolbar3
    val currentToolbar = findViewById<Toolbar>(supportActionBar?.id ?: -1)
    if (currentToolbar == toolbar3) {
        menuInflater.inflate(R.menu.toolbar3_menu, menu)
    }
    return true
}

完成以上修改后,只有切换到toolbar3时选项菜单才会显示,其他Toolbar场景下菜单会被自动清空,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:05:38