Вы можете добавить ViewTreeObserver
, чтобы отслеживать видимость android.support.v7.appcompat.R.id.search_edit_frame
. Вы можете проверить мой ответ здесь: https://stackoverflow.com/a/28762632/1633609
Это копия моего решения от другого вопроса:
я обнаружил, что MenuItemCompat.setOnActionExpandListener(...)
не работает, если вы не сдадите:
searchItem
.setShowAsAction(MenuItemCompat.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW
| MenuItemCompat.SHOW_AS_ACTION_ALWAYS);
Но это меняет SearchView и заменяет DrawerToggle на стрелку назад.
Я хотел сохранить исходные представления и отслеживать состояние расширенного/сложенного состояния и использовать поддерживаемый вид поиска.
Решение:
Когда android.support.v7.widget.SearchView
изменяет состояние представления вид LinearLayout годов, с идентификатором android.support.v7.appcompat.R.id.search_edit_frame
, значение видимости изменяется от View.VISIBLE
до View.GONE
и напротив. Поэтому я добавляю ViewTreeObserver для отслеживания изменения видимости рамки редактирования поиска.
menu_search.xml:
<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:icon="@android:drawable/ic_menu_search"
android:title="@string/search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="always"/>
</menu>
В деятельности:
import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.SearchView;
import android.view.Menu;
import android.view.MenuItem;
..........
private View mSearchEditFrame;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_search, menu);
MenuItem searchItem = (MenuItem) menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) MenuItemCompat
.getActionView(searchItem);
searchView.setSubmitButtonEnabled(false);
mSearchEditFrame = searchView
.findViewById(android.support.v7.appcompat.R.id.search_edit_frame);
ViewTreeObserver vto = mSearchEditFrame.getViewTreeObserver();
vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
int oldVisibility = -1;
@Override
public void onGlobalLayout() {
int currentVisibility = mSearchEditFrame.getVisibility();
if (currentVisibility != oldVisibility) {
if (currentVisibility == View.VISIBLE) {
Log.v(TAG, "EXPANDED");
} else {
Log.v(TAG, "COLLAPSED");
}
oldVisibility = currentVisibility;
}
}
});
return super.onCreateOptionsMenu(menu);
}
Я ответил на вопрос здесь: http://stackoverflow.com/a/28762632/1633609 –