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 に表示され、アプリ アイコンに「戻る」左矢印が表示されます。ユーザーが [戻る] ボタンをタップするか、ActionBar アイコン (左矢印付き) をタップすると、EditText が消えます。EditText を非表示にするだけでなく、このイベントをインターセプトして (いいえ、今回は onOptionsItemSelected() は起動しません)、以前のレイアウトを表示したいと思います。

注: API8 (Android 2.2) との互換性が必要です!

ありがとうございました!

4

2 に答える 2

2

ActionViewを使用している場合、「上へ」または「戻る」をタップしても先祖ナビゲーション( onOptionsItemSelectedで処理できます) は発生しませんが、折りたたみ可能なアクション イベントが発生します。

こちらの Android Developers にあります。

折りたたみ可能なアクション ビューの処理

アクション ビューの可視性に基づいてアクティビティを更新する必要がある場合は、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

ホームボタンについては、あなたが電話したと仮定できますか

mActionBar.setHomeButtonEnabled(true);

onCreate() で Sherlock アクション バーを設定するときは? ホームボタンがクリックされたときに 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);
}
于 2012-11-20T10:07:36.843 に答える