如何让Android右上角图标点击打开新Activity而非显示菜单选项
问题描述
我在Android项目中已经通过Toolbar.setOverflowIcon把右上角图标设置成了铃铛样式,现在点击这个图标默认会弹出menu->main.xml里的菜单选项,但我需要点击它直接打开新Activity,而非显示菜单选项。另外我的问题被标记为重复,但我的需求是让右上角图标直接打开新Activity,不是通过菜单项打开。相关代码如下:
现有代码
onCreateOptionsMenu 代码
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; }
menu->main.xml 代码
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_settings" android:orderInCategory="100" android:title="@string/action_settings" app:showAsAction="never" /> </menu>
onCreate 代码
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setTitle(""); toolbar.setOverflowIcon(ContextCompat.getDrawable(getApplicationContext(),R.drawable.ic_notifications)); setSupportActionBar(toolbar); DrawerLayout drawer = findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.addDrawerListener(toggle); toggle.syncState(); NavigationView navigationView = findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); }
解决方案
想要实现点击铃铛图标直接打开Activity,核心是绕过默认的菜单弹出逻辑,直接给图标绑定点击事件。这里有两种实用的方法:
方法一:拦截默认Overflow按钮的点击事件
这种方法可以保留你已经设置的setOverflowIcon,只需要找到对应的按钮并替换点击逻辑:
- 首先修改
onCreateOptionsMenu,不再填充菜单(因为我们不需要弹出菜单):
@Override public boolean onCreateOptionsMenu(Menu menu) { // 不加载菜单,避免默认弹出菜单 return false; }
- 在
onCreate方法里添加代码,找到Toolbar中的Overflow按钮并设置点击事件:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setTitle(""); toolbar.setOverflowIcon(ContextCompat.getDrawable(getApplicationContext(),R.drawable.ic_notifications)); setSupportActionBar(toolbar); // 延迟执行,确保Toolbar已经完成布局 toolbar.post(() -> { // 遍历Toolbar的子View,找到我们设置的铃铛图标 for (int i = 0; i < toolbar.getChildCount(); i++) { View view = toolbar.getChildAt(i); if (view instanceof ImageView) { Drawable drawable = ((ImageView) view).getDrawable(); if (drawable != null && drawable.getConstantState() != null && drawable.getConstantState().equals(ContextCompat.getDrawable(this, R.drawable.ic_notifications).getConstantState())) { // 给图标绑定点击事件,打开目标Activity view.setOnClickListener(v -> { Intent intent = new Intent(MainActivity.this, YourTargetActivity.class); startActivity(intent); }); break; } } } }); // 以下是你原有的DrawerLayout相关代码,保持不变 DrawerLayout drawer = findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.addDrawerListener(toggle); toggle.syncState(); NavigationView navigationView = findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); }
方法二:使用自定义Toolbar按钮(更稳定可靠)
如果担心不同系统版本Toolbar的子View结构有差异,遍历的方法可能不稳定,那可以直接在Toolbar里添加一个自定义的铃铛图标,完全替代默认的Overflow按钮:
- 先去掉
toolbar.setOverflowIcon(...)这行代码,然后修改你的activity_main.xml中Toolbar的布局:
<androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary"> <!-- 这里可以保留Toolbar的其他元素,比如标题(你之前设置为空,所以可以留空) --> <!-- 添加自定义的铃铛图标 --> <ImageView android:id="@+id/notification_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="end" android:padding="16dp" android:src="@drawable/ic_notifications" /> </androidx.appcompat.widget.Toolbar>
- 在
onCreate中给这个自定义图标设置点击事件:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); Toolbar toolbar = findViewById(R.id.toolbar); toolbar.setTitle(""); setSupportActionBar(toolbar); // 找到自定义的铃铛图标,绑定点击事件 ImageView notificationIcon = findViewById(R.id.notification_icon); notificationIcon.setOnClickListener(v -> { Intent intent = new Intent(MainActivity.this, YourTargetActivity.class); startActivity(intent); }); // 原有的DrawerLayout代码保持不变 DrawerLayout drawer = findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.addDrawerListener(toggle); toggle.syncState(); NavigationView navigationView = findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(this); }
- 同样修改
onCreateOptionsMenu返回false,避免默认菜单弹出:
@Override public boolean onCreateOptionsMenu(Menu menu) { return false; }
这两种方法都能实现你要的效果,第二种方法因为是自定义View,兼容性更好,推荐优先使用。
内容的提问来源于stack exchange,提问作者YVS1102
相关产品推荐
相关产品推荐

