2017-06-15 112 views
2

好吧,我要的是當處理動作條的圖標的可視性:如何使用搜索查看

  • 初始化動作條與所有的項目,除了「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 ---(液)---

我想這方法setOnSearchClickListenersetOnCloseListenerandroid.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; 
       } 
      }); 

現在,它工作得很好(:

回答

0

我希望得到你的權利:你PRES在第一時間s BACK,鍵盤被隱藏起來。第二次按下BACK時,應用程序將退出。

如果是這樣,那麼一切正常。因爲super.onBackPressed()應該這樣做。它會嘗試隱藏鍵盤,如果它顯示。如果不是,它會嘗試去完成上一個活動。如果沒有,它會退出應用程序。

所以你需要做的是玩onBackPressed()方法。基本上,如果你確定你應該做什麼,你不一定需要調用超級方法。

@Override 
public void onBackPressed() { 
    if (isSearching) { 
     supportInvalidadeOptionsMenu(); 
     isSearching = false;  
    } else { 
     super.onBackPressed(); 
    } 
} 

所以,現在,當你不按BACK按鈕,該活動將檢查是否isSearching,並決定重新呈現在操作欄或採取的正常行動如常。

您需要添加一些邏輯來設置布爾標誌isSearching,例如,單擊搜索時將isSearching設置爲true。

我不確定是否supportInvalidadeOptionsMenu()會重置您的操作欄。無論如何,您可以調整每個視圖的可見性。

+0

謝謝,克里斯!但恐怕你弄錯了......第一次按Back,鍵盤隱藏(確定,這是正常的),之後,我按下Back的「第一次」,搜索結束,但圖標沒有重新加載...我已經試過手動設置可見性,而不是使用「supportInvalidateOptionsMenu()」,它仍然不起作用;(。如果我使用你的方法,它的作用就是在所有的事情之後再次按下... It將不會返回到上一個活動,但不會在第一次按下時運行=/ –

+0

這是因爲您調用了super.onBackPressed(),超級方法將退出應用程序,除非您按照我的說法執行操作。當您按下代碼中的按鈕時,super.onBackPressed()被稱爲EVERYTIME –

+0

您需要告訴onBackPressed()方法到底應該發生什麼,如果顯示鍵盤,則使用super.onBackPressed (),否則如果正在搜索,則重新渲染操作欄,不要調用super.onBackPressed(),els e調用super.onBackPressed()。在這種情況下,你應該去以前的活動。 –