0

使用此代码(取自 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 中,并且 App 图标获得“返回”左箭头。如果用户点击“返回”按钮或点击 ActionBar 图标(带有左箭头),EditText 就会消失。除了隐藏 EditText 之外,我还想拦截此事件(不,onOptionsItemSelected() 这次不会触发)并显示以前的布局。

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

谢谢!

4

2 回答 2

2

使用ActionView时,点击“向上”或“返回”不会导致祖先导航(可以由onOptionsItemSelected处理),但会导致Collapsible Action 事件

可在Android 开发人员上找到。

处理可折叠的动作视图

如果您需要根据操作视图的可见性来更新您的活动,您可以通过定义一个 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

于 2012-11-20T14:10:54.207 回答
0

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

mActionBar.setHomeButtonEnabled(true);

在 onCreate() 中设置 Sherlock 操作栏时?我相信这是在单击主页按钮时获得项目 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);
}
于 2012-11-20T10:07:36.843 回答