3

私はこのコードを使用して折りたたみ可能なものを配置しView (EditText)ましたActionBarSherlock

public boolean onCreateOptionsMenu(Menu menu) {
    getSupportMenuInflater().inflate(R.menu.activity_main, menu);

    //Used to put dark icons on light action bar
    boolean isLight = false;

    menu.add("Search")
        .setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.ic_search)
        .setActionView(R.layout.collapsible_edittext)
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
    return true;
}

setOnEditorActionListenerビューを(IDで)設定しようとすると、アプリがクラッシュします。

EditText editText = (EditText) findViewById(R.id.search);

editText.setOnEditorActionListener(new OnEditorActionListener() {
    @Override
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {

        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            performSearch(v.getText().toString(), 3);
            return true;
        }
        return false;
    }
});

SearchFieldユーザーがキーボードの「検索」キーを押したときに入力して検索を実行する必要がありますが、ビューActionBarにバインドする方法がわかりません。setOnEditorActionListener

4

1 に答える 1

3

それR.id.searchはあなたのR.layout.collapsible_edittextレイアウトの中にあると思いますか?どこfindViewById()から電話しているの?たとえば、あなたはそれを呼んでいますonCreate()onResume()?この時点でメニューが作成されていることを確認しますか?

中に含めることをお勧めしますonCreateOptionsMenu()。このようなものが機能する可能性があります:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getSupportMenuInflater().inflate(R.menu.activity_main, menu);
    boolean isLight = false;
    int menuItemId = 
        menu.add("Search")
            .setIcon(isLight ? R.drawable.ic_search_inverse : R.drawable.ic_search)
            .setActionView(R.layout.collapsible_edittext)
            .setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS |
                MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW)
            .getItemId();
    EditText editText =
        (EditText) menu.findItem(menuItemId).getActionView().findViewById(R.id.search);
    editText.setOnEditorActionListener(...);
}

もう1つのオプションは、を呼び出す前にビューを拡張してリスナーをアタッチすることMenuItem.setActionView(actionView)です。

(ちなみに、クラッシュの原因を特定してもらいたい場合は、例外とスタックトレースを含めると便利です。)

于 2012-09-24T02:34:35.150 に答える