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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:22:04