Что ж, я хочу:
- Инициализировать ActionBar со всеми элементами, кроме «searchSettings»;
- При щелчке по значку поиска появляются параметры поиска, а остальные значки исчезают;
- При закрытии поиска EditText (нажатие кнопки «Назад» на устройстве или кнопки «Назад» на ActionBar) ActionBar возвращается в исходное состояние (появляются все значки, кроме «searchSettings»).
Мой фактический код следующий:
(Я импортировал android.support.v7.widget.SearchView
вместо android.widget.SearchView
. Когда я использовал android.widget.SearchView
, это работало нормально, но другие вещи не работали)
private MenuItem searchIteam, searchSettings;
private SearchView searchView;
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.menu_main, menuMain);
searchItem = menu.findItem(R.id.search);
searchSettings = menu.findItem(R.id.action_searchSettings);
searchView = (SearchView)MenuItemCompat.getActionView(item);
searchSettings.setVisible(false); // hide searchSettings Item when Menu is created
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
(...)
return false;
}
});
// Detect SearchView icon clicks
searchView.setOnSearchClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
setItemsVisibility(menuMain, item, false);
searchSettings.setVisible(true);
}
});
// Detect SearchView close
searchView.setOnCloseListener(new SearchView.OnCloseListener() {
@Override
public boolean onClose() {
supportInvalidateOptionsMenu(); //shouldn't this reload the Action Bar as it was when onCreate?
return true;
}
});
return super.onCreateOptionsMenu(menu);
}
private void setItemsVisibility(Menu menu, MenuItem exception, boolean visible) {
for (int i=0; i<menu.size(); ++i) {
MenuItem item = menu.getItem(i);
if (item != exception) item.setVisible(visible);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
onBackPressed();
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
supportInvalidadeOptionsMenu();
super.onBackPressed();
}
Этот код не работает, когда я нажимаю «назад» в первый раз, он только закрывает EditText поиска, а значки не меняются. Если я снова нажму «назад», действие поднимется на уровень выше, но я вижу, что значки становятся в начале (получают то, что должны, когда я нажимал «назад» в первый раз) за некоторое время до закрытия действия ...
--- ИЗМЕНИТЬ ---
В настоящее время, если я нажму значок Search ActionBar, а затем начну несколько раз нажимать кнопку «Назад», произойдет следующее:
- 1-е нажатие: клавиатура прячется, но поиск EditText все еще открыт;
- 2-е нажатие: поиск завершается (поиск EditText закрывается и отображается содержимое обычной активности);
- 3-е нажатие: действие закрывается.
Затем, для целей тестирования, я сделал это:
boolean pressed1, pressed2, pressed3;
searchView.setOnSearchClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
pressed1 = false;
pressed2 = false;
pressed3 = false;
setItemsVisibility(menuMain, item, false);
searchSettings.setVisible(true);
}
});
@Override
public void onBackPressed() {
if (!pressed1) {
pressed1 = true;
}
else if(!pressed2) {
pressed2 = true;
}
else if(!pressed3) {
pressed3 = true;
supportInvalidateOptionsMenu();
}
else {
super.onBackPressed();
}
}
И вот что происходит:
- 1-е нажатие: клавиатура прячется, но поиск EditText все еще открыт;
- 2-е нажатие: поиск завершается (поиск EditText закрывается и отображается содержимое обычной активности);
- 3-е нажатие: ничего не происходит;
- 4-е нажатие: ничего не происходит;
- 5-е нажатие: панель действий перезагружается, как я хотел;
- 6-е нажатие: активность закрывается;
--- ИЗМЕНИТЬ 2 ---
Затем я изменился на это:
@Override
public void onBackPressed() {
if (!pressed1) {
pressed1 = true;
onBackPressed();
}
else if(!pressed2){
pressed2 = true;
onBackPressed();
}
else if(!pressed3){
pressed3 = true;
supportInvalidateOptionsMenu();
}
else {
super.onBackPressed();
}
}
Сейчас происходит следующее:
- 1-е нажатие: клавиатура прячется, но поиск EditText все еще открыт;
- 2-е нажатие: поиск завершается (поиск EditText закрывается и отображается содержимое обычной активности);
- 3-е нажатие: ActionBar перезагружается, как я хотел;
- 4-е нажатие: действие закрывается;
--- РЕДАКТИРОВАТЬ 3 --- (РЕШЕНИЕ) ---
Я предполагаю, что методы setOnSearchClickListener
и setOnCloseListener
взяты из android.widget.SearchView
... Поскольку вместо этого я импортировал android.support.v7.widget.SearchView
, я изменил их на:
MenuItemCompat.setOnActionExpandListener(searchItem,
new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem menuItem) {
setItemsVisibility(menu, searchItem, false);
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem menuItem) {
supportInvalidateOptionsMenu();
return true;
}
});
Теперь все работает нормально (: