2012-11-20 94 views
0

通過此代碼(摘自ABS示例),我可以在我的ActionBar中添加一個「搜索」圖標,單擊時將顯示一個EditText(用於在列表中搜索) :在使用ActionBarSherlock在Android中搜索setActionView後返回使用ActionBarSherlock

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    menu.add(Menu.NONE, searchId, Menu.NONE, R.string.menu_search) 
    .setIcon(android.R.drawable.ic_menu_search) 
    .setActionView(R.layout.collapsible_edittext) 
    .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 
    return true; 
} 

有了這個代碼,我能攻「搜索」圖標後,顯示不同的佈局:

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case searchId: 
     search = (EditText) item.getActionView(); 
     search.addTextChangedListener(filterTextWatcher); 
     search.requestFocus(); 
     InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
     imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); 

     setContentView(R.layout.search); 

     this.allSongs = data.getSongs(); 
     ListView list = (ListView) findViewById(R.id.songList); 
     list.setAdapter(new SongAdapter(this, this.allSongs)); 
    } 
    return true; 
} 

有了這個代碼,我能處理我的搜索:

private TextWatcher filterTextWatcher = new TextWatcher() { 
    public void afterTextChanged(Editable s) { 
    } 

    public void beforeTextChanged(CharSequence s, int start, int count, int after) { 
    } 

    public void onTextChanged(CharSequence s, int start, int before, int count) { 

     List<Song> results = new ArrayList<Song>(); 

     Locale locale = Locale.getDefault(); 

     for (Song song : allSongs) { 
      if (song.getTitle().toLowerCase(locale).contains(s.toString().toLowerCase(locale))) 
       results.add(song); 
     } 

     ListView list = (ListView) findViewById(R.id.songList); 
     list.setAdapter(new SongAdapter(ctx, results)); 
    } 
}; 

當用戶點擊「搜索」圖標時,EditText出現在ActionBar中,App圖標獲得「後退」左箭頭。 如果用戶點擊「返回」按鈕或點擊ActionBar圖標(帶有向左箭頭),EditText消失。 我想截取這個事件(不,onOptionsItemSelected()這次不會觸發),並且除了隱藏EditText之外還顯示前面的佈局。

注:我需要API8(Android 2.2)兼容性!

謝謝!

回答

2

當使用的ActionView,攻「向上」或「背」不導致祖先導航(可通過onOptionsItemSelected來處理),但會導致摺疊操作事件

在Android Developers上找到了here

處理溼陷性作用的觀點

如果您需要根據您的 動作視圖的知名度,更新你的活動,你可以當它展開和摺疊通過定義OnActionExpandListener並對其進行註冊 接收回調 和setOnActionExpandListener()。例如:

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.options, menu); 
    MenuItem menuItem = menu.findItem(R.id.actionItem); 
    ... 

    menuItem.setOnActionExpandListener(new OnActionExpandListener() { 
     @Override 
     public boolean onMenuItemActionCollapse(MenuItem item) { 
      // Do something when collapsed 
      return true; // Return true to collapse action view 
     } 

     @Override 
     public boolean onMenuItemActionExpand(MenuItem item) { 
      // Do something when expanded 
      return true; // Return true to expand action view 
     } 
    }); 
} 

因此,要回答我的問題,我正在尋找onMenuItemActionCollapse事件。

PS:爲了更好的一致性,我應該將我的情況下searchId:(`因爲在`的onCreate)onOptionsItemSelectedonMenuItemActionExpand

0

對於主頁按鈕,我可以假設你建立夏洛克操作欄中的onCreate()調用時

mActionBar.setHomeButtonEnabled(true); 

?我相信這是必要的,以便在單擊主頁按鈕時獲取具有android.R.id.home項目ID的onOptionsItemSelected()回調。

對於後退按鈕,我想你只需要在您的活動覆蓋的onkeydown:

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { 
     // Do something 
     return true; 
    } 

    return super.onKeyDown(keyCode, event); 
} 
+0

不,我不叫'.setHomeButtonEnabled(真) '我的活動我不需要「主頁」按鈕,我只在搜索時才需要它(撤消搜索)。 由於'.setActionView(R.layout.collapsible_edittext)',我認爲它自己顯示。 – hybrid2102

相關問題