Использование SearchView с AppCompatActivity приводит к сбоям пользовательского интерфейса

Я пытаюсь создать приложение Android с кнопкой поиска на панели действий, и когда пользователь нажимает кнопку поиска, на панели действий появляется текстовое поле поиска, например, в приложении Google Messenger (см. Ниже). Google Messenger с рутинным действием поиска. Google Messenger с расширенным поисковым действием.

Я попытался реализовать его, как показано ниже, но мое приложение выглядит так: Мое приложение с рухнувшим действием поиска Мое приложение с расширенным поисковым действием

Есть несколько проблем с этим. Например, текст читает «Поиск …» с помощью elipsis, в отличие от простого «поиска» без elipsis, но, безусловно, самое главное в том, что на панели инструментов нет кнопки «Назад», кнопка поиска нажата Слишком далеко влево, а кнопка переполнения справа сдвинута в сторону. Кроме того, нажатие кнопки физического возврата на моем устройстве не сворачивает поиск, оно просто существует в приложении.

Некоторые из кода, который я использовал для реализации панели поиска, приведены ниже. Я попытался установить SearchViewExpandListener как показано ниже, чтобы кнопка возврата появлялась при расширении вида поиска, однако она не работает.

EDIT: Я также запускал приложение с точками останова в моих onMenuItemActionExpand и onMenuItemActionCollapsed , и я узнал, что эти методы на самом деле никогда не вызываются.

MainActivity.java

 import android.content.Context; import android.support.v4.view.MenuItemCompat; import android.support.v4.view.ViewPager; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.SearchView; import android.support.v7.widget.Toolbar; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayShowHomeEnabled(false); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu, menu); MenuItem searchItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); // See above MenuItemCompat.setOnActionExpandListener(searchItem, new SearchViewExpandListener(this)); MenuItemCompat.setActionView(searchItem, searchView); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String s) { Toast.makeText(MainActivity.this, "You searched " + s, Toast.LENGTH_SHORT).show(); return false; } @Override public boolean onQueryTextChange(String s) { return false; } }); return true; } // See above private class SearchViewExpandListener implements MenuItemCompat.OnActionExpandListener { private Context context; public SearchViewExpandListener (Context c) { context = c; } @Override public boolean onMenuItemActionExpand(MenuItem item) { ((AppCompatActivity) context).getSupportActionBar().setDisplayShowHomeEnabled(true); return false; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { ((AppCompatActivity) context).getSupportActionBar().setDisplayShowHomeEnabled(false); return false; } } } 

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" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="ifRoom"/> <item android:id="@+id/action_about" android:title="About" app:showAsAction="never"/> </menu> 

Также кажется, что это не только у меня есть эта проблема. В этом руководстве по внедрению SearchView возникают похожие проблемы.

Проблема этого парня, которая похожа на мою.

Итак, каков правильный способ реализации панели поиска в AppCompatActivity, которая приводит к поисковой панели, подобной этой, в руководствах по дизайну материалов Google и тому подобное в их приложениях, таких как Google Messenger? Я чувствую, что я бесконечно гугл в прошлом, но я не могу найти ничего, что помогло бы мне.

Используйте флаг collapseActionView вместе с always в пункте меню showAsAction onViewView.

 app:showAsAction="always|collapseActionView" 

Флаг collapseActionView указывает, как отображать виджет, когда пользователь не взаимодействует с ним: если виджет находится на панели приложений, приложение должно отображать виджет в виде значка. Если виджет находится в меню переполнения, приложение должно отображать виджет как элемент меню. Когда пользователь взаимодействует с видом действия, он расширяется, чтобы заполнить панель приложений.