Android自定义Toolbar(含PopupMenu)不显示问题求助
问题根源
- 你的
toolbar_fragment未被添加到Activity布局中,导致其菜单逻辑完全未执行 - 即便添加Fragment,也未启用菜单功能(缺少
setHasOptionsMenu(true)) - 菜单Item未配置
showAsAction属性,系统无法识别要将其放入溢出菜单
方案一:直接在Activity中实现(最简单高效)
1. 修改主Activity代码
public class activity_test extends AppCompatActivity { private Toolbar toolbar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); ActivityHolder.get_instance().set_last_activity(this); toolbar = findViewById(R.id.test_toolbar); setSupportActionBar(toolbar); // 可选:设置Toolbar标题 getSupportActionBar().setTitle("自定义标题"); } // 加载菜单布局 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_menu, menu); return true; } // 处理菜单点击事件 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.settings: Toast.makeText(this, "设置", Toast.LENGTH_SHORT).show(); return true; case R.id.downloads: Toast.makeText(this, "下载", Toast.LENGTH_SHORT).show(); return true; case R.id.bookmarks: Toast.makeText(this, "书签", Toast.LENGTH_SHORT).show(); return true; case R.id.about_us: Toast.makeText(this, "关于我们", Toast.LENGTH_SHORT).show(); return true; default: return super.onOptionsItemSelected(item); } } }
2. 修改菜单布局(main_menu.xml)
添加app命名空间,并配置showAsAction="never"确保Item进入溢出菜单:
<?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/settings" android:title="settings" app:showAsAction="never"/> <item android:id="@+id/downloads" android:title="downloads" app:showAsAction="never"/> <item android:id="@+id/bookmarks" android:title="bookmarks" app:showAsAction="never"/> <item android:id="@+id/about_us" android:title="about_us" app:showAsAction="never"/> </menu>
方案二:使用Fragment处理菜单(若坚持架构需求)
1. 修改Activity布局,添加Fragment容器
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <include layout="@layout/toolbar" android:id="@+id/test_toolbar"/> <!-- 添加Fragment容器 --> <FrameLayout android:id="@+id/fragment_container" android:layout_width="match_parent" android:layout_height="0dp" app:layout_constraintTop_toBottomOf="@id/test_toolbar" app:layout_constraintBottom_toBottomOf="parent"/> </androidx.constraintlayout.widget.ConstraintLayout>
2. 修改Activity代码,添加Fragment
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_test); ActivityHolder.get_instance().set_last_activity(this); toolbar = findViewById(R.id.test_toolbar); setSupportActionBar(toolbar); // 将Toolbar Fragment添加到Activity getSupportFragmentManager().beginTransaction() .replace(R.id.fragment_container, new toolbar_fragment()) .commit(); }
3. 修改Toolbar Fragment代码,启用菜单功能
public class toolbar_fragment extends Fragment { public toolbar_fragment(){ super(R.layout.toolbar); } @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 启用Fragment菜单功能 setHasOptionsMenu(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ return inflater.inflate(R.layout.toolbar, container, false); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { inflater.inflate(R.menu.main_menu, menu); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.settings: Toast.makeText(getContext(), "设置", Toast.LENGTH_SHORT).show(); return true; case R.id.downloads: Toast.makeText(getContext(), "下载", Toast.LENGTH_SHORT).show(); return true; case R.id.bookmarks: Toast.makeText(getContext(), "书签", Toast.LENGTH_SHORT).show(); return true; case R.id.about_us: Toast.makeText(getContext(), "关于我们", Toast.LENGTH_SHORT).show(); return true; default: return super.onOptionsItemSelected(item); } } }
额外验证:确保Toolbar布局正确
你的toolbar.xml需为标准AndroidX Toolbar:
<?xml version="1.0" encoding="utf-8"?> <androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" android:theme="?attr/actionBarTheme"> </androidx.appcompat.widget.Toolbar>
内容的提问来源于stack exchange,提问作者mohammad
相关产品推荐
相关产品推荐

