好吧,我要的是當處理動作條的圖標的可視性:如何使用搜索查看
- 初始化動作條與所有的項目,除了「SearchSettings的」;
- 單擊搜索圖標時,會出現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並且圖標不會改變。如果我再次按下,活動會升級,但在活動關閉前一小會兒,我可以看到圖標變成開始時的狀態(第一次按「後退」時的狀態)。
---編輯---
目前,如果我點擊搜索動作條圖標,然後開始按「返回」按鈕多次,會發生以下情況:
- 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關閉並顯示正常活動的內容);
- 第三次按下:沒有任何反應;
- 第4次按下:沒有任何反應;
- 第5次按下:ActionBar按我的意願重新加載;
- 第6次按下:活動結束;
--- EDIT 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關閉並顯示正常活動的內容);
- 第三次按下:ActionBar按照我的意願重新加載;
- 第4次按下:活動關閉;
---編輯3 ---(液)---
我想這方法setOnSearchClickListener
和setOnCloseListener
從android.widget.SearchView
...正如我已經導入android.support.v7.widget.SearchView
相反,我VE他們改爲:
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;
}
});
現在,它工作得很好(:
謝謝,克里斯!但恐怕你弄錯了......第一次按Back,鍵盤隱藏(確定,這是正常的),之後,我按下Back的「第一次」,搜索結束,但圖標沒有重新加載...我已經試過手動設置可見性,而不是使用「supportInvalidateOptionsMenu()」,它仍然不起作用;(。如果我使用你的方法,它的作用就是在所有的事情之後再次按下... It將不會返回到上一個活動,但不會在第一次按下時運行=/ –
這是因爲您調用了super.onBackPressed(),超級方法將退出應用程序,除非您按照我的說法執行操作。當您按下代碼中的按鈕時,super.onBackPressed()被稱爲EVERYTIME –
您需要告訴onBackPressed()方法到底應該發生什麼,如果顯示鍵盤,則使用super.onBackPressed (),否則如果正在搜索,則重新渲染操作欄,不要調用super.onBackPressed(),els e調用super.onBackPressed()。在這種情況下,你應該去以前的活動。 –