Android Studio自定义Toolbar中搜索菜单不显示问题求助
自定义Toolbar搜索菜单无法显示的问题
我在Android Studio中实现了带有标题和可正常运行Popup Menu的自定义Toolbar,但搜索菜单始终无法显示,当前页面的Toolbar中完全看不到搜索菜单图标。已尝试添加setSupportActionBar(toolbar)让Toolbar模拟ActionBar的行为,也试过仿照Popup Menu的实现方式使用ImageView,问题仍未解决。相关代码如下:
Main Activity 代码
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.SearchView; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.appcompat.widget.Toolbar; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ImageView; import android.widget.PopupMenu; import android.widget.TextView; import java.util.ArrayList; public class Skills_main extends AppCompatActivity implements SkillsRecyclerViewInterface { ArrayList<SkillsListModel> skillsListModels = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_skills_main); RecyclerView recyclerView = findViewById(R.id.skillsRecyclerView); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); setUpSkillsListModels(); SkillsRecyclerViewAdapter adapter = new SkillsRecyclerViewAdapter(this, skillsListModels, this); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(this)); ImageView menuIcon = findViewById(R.id.menu_icon); TextView title = findViewById(R.id.toolbar_title); String skillsTable = "Skills"; title.setText(skillsTable); menuIcon.setOnClickListener(this::showMenu); } private void setUpSkillsListModels() { String[] skillsHeaders = getResources().getStringArray(R.array.skillHeaders); String[] skillDescriptions = getResources().getStringArray(R.array.skillDescriptions); for (int i = 0; i < skillsHeaders.length; i++) { skillsListModels.add(new SkillsListModel(skillsHeaders[i], skillDescriptions[i])); } } private void showMenu(View v){ PopupMenu popupMenu = new PopupMenu(Skills_main.this, v); popupMenu.getMenuInflater().inflate(R.menu.popup_menu, popupMenu.getMenu()); popupMenu.setOnMenuItemClickListener(item -> { if(item.getItemId() == R.id.appInfo) { Intent intent = new Intent(Skills_main.this, App_Info_Page.class); startActivity(intent); } if(item.getItemId() == R.id.appHome) { Intent intent = new Intent(Skills_main.this, MainActivity.class); startActivity(intent); } return true; }); popupMenu.show(); } @Override public void onItemClick(int position) { Intent intent = new Intent(Skills_main.this, SkillsDescriptions.class); intent.putExtra("TITLE", skillsListModels.get(position).getSkillsTitle()); intent.putExtra("DESCRIPTION", skillsListModels.get(position).getSkillsDescription()); startActivity(intent); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.search_menu, menu); MenuItem item = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) item.getActionView(); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { return false; } @Override public boolean onQueryTextChange(String newText) { return false; } }); return super.onCreateOptionsMenu(menu); } }
Toolbar XML 代码
<?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="wrap_content" android:background="@color/list_background" android:elevation="8dp" android:id="@+id/toolbar" android:fitsSystemWindows="true"> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/menu_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingVertical="15dp" android:contentDescription="@string/app_info" android:src="@drawable/baseline_menu_24" /> <TextView android:id="@+id/toolbar_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_centerVertical="true" android:layout_marginStart="40dp" android:fontFamily="@font/graduate" android:text="@string/app_name" android:textColor="#E3CDB3" android:textSize="22sp" /> </RelativeLayout> </androidx.appcompat.widget.Toolbar>
Search Menu 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_search" android:title="Search" android:icon="@drawable/baseline_search_24" app:showAsAction="ifRoom|collapseActionView" app:actionViewClass="androidx.appcompat.widget.SearchView"/> </menu>
解决方法
1. 调整Toolbar内部布局,留出菜单空间
Toolbar内部的RelativeLayout设置了match_parent宽度,完全占据了Toolbar的横向空间,导致系统默认的菜单区域(Toolbar右侧)被覆盖,搜索图标无法显示。修改RelativeLayout的宽度为wrap_content:
<RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentStart="true" android:layout_centerVertical="true">
2. 隐藏系统默认标题
调用setSupportActionBar(toolbar)后,系统会显示默认的ActionBar标题,和自定义的TextView标题冲突,同时可能影响菜单布局。在setSupportActionBar(toolbar)后添加以下代码:
getSupportActionBar().setDisplayShowTitleEnabled(false);
修改后的MainActivity onCreate片段:
Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); // 隐藏系统默认标题,避免和自定义标题冲突 getSupportActionBar().setDisplayShowTitleEnabled(false);
3. 确认依赖和配置正确性
确保项目中已经引入androidx.appcompat依赖,Activity继承自AppCompatActivity,Toolbar和SearchView都使用androidx.appcompat包下的组件(你的代码已经满足这一点)。
内容的提问来源于stack exchange,提问作者user23513137
相关产品推荐
相关产品推荐

