如何在ActionBarSherlock中将"setOnEditorActionListener"设置到EditText?

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;
    }
});

我需要在ActionBar 中加入一个SearchField,并且在用户按下“搜索”键时执行搜索,但我不知道如何将setOnEditorActionListener绑定到视图中。

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(...);
}

另一个选择是在调用MenuItem.setActionView(actionView)之前展开视图并附加侦听器。

(顺便说一句,如果您希望其他人确定崩溃的原因,包括异常和堆栈跟踪会很有帮助。)


与之前相同,导致应用程序崩溃,我已经提供了代码和LogCat输出如下。 - Nevercom
你的方法很好用,是其他东西导致了应用程序崩溃,我不知道是什么!谢谢。 - Nevercom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接