在Android ActionBar上访问ActionView

时间:2012-08-23 07:13:57

标签: android android-actionbar actionbarsherlock

从操作栏中使用的菜单项获取actionview时遇到问题。 我出于兼容性原因使用Actionbarsherlock。

我在onCreateOptionMenu中使用此代码:

        menu.add("Search")
        .setIcon(R.drawable.ic_search)
        .setActionView(R.layout.collapsible_edittext)
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);

我设置的ActionView只是一个来自XML的EditText,它将根据宽度“fill_parent”。 由于我找不到访问此edittext以注册事件处理程序的方法,我试图在oncreateoptionsmenu(以及稍后的onOptionsItemSelected)中填充“R.layout.collapsible_edittext”,将结果添加为acitonview。 在我这样做之后我可以访问edittext但是在单击图标后它不再占用我的操作栏中的全宽。

任何提示如何正确访问ActionView?

1 个答案:

答案 0 :(得分:2)

EditText布局

<?xml version="1.0" encoding="utf-8"?>
<EditText xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:singleLine="true"
          android:hint="Search"/>

代码

 private EditText search;


  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) {
            //... your logic here    
        }
    };

@Override
    public boolean onCreateOptionsMenu(com.actionbarsherlock.view.Menu menu) {
        menu.add(0, 3, 3, R.string.ac_search  ).setIcon(R.drawable.ic_action_search).setActionView(R.layout.action_search).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
        return super.onCreateOptionsMenu(menu);
    }


  @Override
    public boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item) {
        switch (item.getItemId()){

            case 3:
                search = (EditText) item.getActionView();
                search.addTextChangedListener(filterTextWatcher);
                break;

        }
        return true;
    }