Я использую SearchView
в ActionBar
ListView
. Увеличительное стекло можно коснуться, SearchView
показывает окно редактирования, и пользователь может ввести текст для фильтрации содержимого списка. Это почти работает. Однако, когда пользователь нажимает кнопку Up, SearchView
сбрасывается обратно на значок, текст внутри виджета очищается, и фильтрация сбрасывается. Эффект (в моем случае) заключается в том, что список можно фильтровать только тогда, когда SearchView
не отображается. Желаемое поведение заключается в том, чтобы сохранить текст фильтра также после обнуления SearchView
.SearchView в ActionBar - проблемы с кнопкой * Up *
Внимание: Поведение, вероятно, изменилось в Android 4.3. С 4.2.2 он работал как раз. См. Замечания ниже.
Детали: Чтобы быть более конкретным, меню содержит следующие пункты:
<item android:id="@+id/menu_search_customers"
android:title="@string/menu_search_text"
android:icon="@android:drawable/ic_menu_search"
android:showAsAction="ifRoom|collapseActionView"
android:actionViewClass="android.widget.SearchView" />
Обратите внимание на значок и android:showAsAction
. Я верю, что кнопка Вверх появляется по умолчанию, когда SearchView
расширен (на Вверх Я имею в виду <
плюс значок - см. Правильное изображение с синей книгой от официального Navigation with Back and Up). Кажется, что реализация обработчика по умолчанию просто сворачивает развернутый SearchView
(возвращается в состояние значка).
При отладке, я обнаружил, что onQueryTextChange()
увольняют с пустым текстом, когда Up используется. (Я считаю, что это не относится к Android 4.2.2, потому что оно работало так, как нужно до обновления ОС.) Именно поэтому фильтрация элементов списка также сбрасывается - см. Мой onQueryTextChange()
ниже. Я хочу, чтобы SearchView
рухнул, а текст фильтра отображался как субтитр в панели действий.
До сих пор мой код связан с SearchView
выглядит следующим образом:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// MenuInflater adds the magnifying glass icon for the SearchView
// to the ActionBar as the always visible menu item.
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.customers_menu, menu);
// Get the related SearchView widget.
SearchView sv = (SearchView) menu.findItem(R.id.menu_search_customers)
.getActionView();
// Get the changes immediately.
sv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
// I am not sure whether the onQueryTextSubmit() is important
// for the purpose.
@Override
public boolean onQueryTextSubmit(String query) {
getActionBar().setSubtitle(mCurFilter);
return true;
}
@Override
public boolean onQueryTextChange(String newText) {
// The newText is stored into a member variable that
// is used when the new CursorLoader is created.
mCurFilter = newText;
getActionBar().setSubtitle(mCurFilter);
getLoaderManager().restartLoader(0, null,
CustomersOverviewActivity.this);
return true;
}
});
return true;
}
возобновленный погрузчик вызывает onCreateLoader
. Обратите внимание, что mCurFilter
используется для построения запроса SQL:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String[] projection = { CustomerTable._ID,
CustomerTable.CODE,
CustomerTable.NAME,
CustomerTable.STREET,
CustomerTable.TOWN };
String selection = null; // init
String[] selectionArgs = null; // init
if (! mCurFilter.isEmpty()) {
selection = CustomerTable.NAME + " like ?";
selectionArgs = new String[]{ "%" + mCurFilter +"%" };
}
CursorLoader cursorLoader = new CursorLoader(this,
DemoContentProvider.CUSTOMERS_CONTENT_URI, projection,
selection, selectionArgs,
orderInfo);
return cursorLoader;
}
Я хотел бы, чтобы обнаружить ситуацию, когда Up нажимается перед темonQueryTextChange()
называется. Таким образом (скажем) я могу установить флаг и заблокировать назначение mCurFilter
пустым содержимым SearchView
. Кроме того, когда значок поиска снова расширяется, я хотел бы инициализировать текст в развернутом SearchView
от mCurFilter
до (показано расширенное представление с текстом фильтра). Как это можно сделать?
Update: Ранее реализация SearchView
была ...
@Override
public void onActionViewCollapsed() {
clearFocus();
updateViewsVisibility(true);
mQueryTextView.setImeOptions(mCollapsedImeOptions);
mExpandedInActionView = false;
}
Теперь она содержит ...
@Override
public void onActionViewCollapsed() {
setQuery("", false);
clearFocus();
updateViewsVisibility(true);
mQueryTextView.setImeOptions(mCollapsedImeOptions);
mExpandedInActionView = false;
}
Вы знаете, что может послужить причиной установки запроса на пустую строку? Должен ли я переопределить новую реализацию старым кодом? Или есть лучший способ?
Интересная, для какой версии Android вы разрабатываете? Я хотел получить этот эффект, но не смог его достичь, мой поиск DID Неясно, когда я рухнул поиск ...:/ – o0rebelious0o
Последний 4.3. Я просто учился, пытаясь создать демо-приложение. Совместимость со старыми версиями Android - это задача, запланированная на более поздний срок. Приятно иметь подтверждение, как мне показалось, что он работал раньше, когда я использовал 4.2. Но я не был уверен, не изменился ли код с того времени. – pepr
Да, я считаю, что это на самом деле ошибка в раннем андроиде. Вы просмотрели http://developer.android.com/reference/android/view/CollapsibleActionView.html для onActionViewCollapsed(), чтобы обрабатывать очистку результатов поиска? (Ошибка в раннем андроиде означала, что этот метод бесполезен * вздох *) – o0rebelious0o