使用ActionBarSherlock在Android中使用setActionView搜索后返回

时间:2012-11-20 09:44:19

标签: android search android-actionbar actionbarsherlock

使用此代码(取自ABS示例)我可以在ActionBar中添加“搜索”图标,单击时将显示EditText(以在列表中搜索):

@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中,而应用程序图标会获得“向后”左箭头。 如果用户点击“后退”按钮或点击ActionBar图标(使用左箭头),EditText将消失。 我想拦截这个事件(不,onOptionsItemSelected()这次不会触发)并显示之前的布局,除了隐藏EditText。

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

谢谢!

2 个答案:

答案 0 :(得分:2)

使用 ActionView 时,点击“向上”或“向后”不会导致祖先导航(可由 onOptionsItemSelected处理 em>)但会导致可折叠操作事件

在Android开发者身上找到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: onOptionsItemSelected 移到 onMenuItemActionExpand

答案 1 :(得分:0)

对于Home按钮,我可以假设您调用了

mActionBar.setHomeButtonEnabled(true);

在onCreate()中设置Sherlock Action Bar时?我相信当单击主页按钮时,为了获得具有项目ID android.R.id.home的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);
}