【问题标题】:EditText in Actionbar only gets focus when SHOW_AS_ACTION_NEVER操作栏中的 EditText 仅在 SHOW_AS_ACTION_NEVER 时获得焦点
【发布时间】:2012-10-04 23:58:49
【问题描述】:

我的操作栏 (ActionbarSherlock) 中有一个折叠的搜索 EditView 菜单。当 setShowAsAction 方法设置为 SHOW_AS_ACTION_NEVER 时,键盘显示并且用户可以按预期开始输入。

但是,当我将值设置为 SHOW_AS_ACTION_ALWAYS 时,用户必须在开始输入之前触摸 EditText,因为它似乎没有焦点!

我的代码是否有问题或解决此问题的方法?

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    final MenuItem search = menu.add(0, MENU_SEARCH, MENU_SEARCH, getString(R.string.search));
    search.setIcon(R.drawable.ic_action_search);
    search.setActionView(R.layout.action_search);
    search.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case MENU_SEARCH:
            mSearch = (EditText) item.getActionView();
            mSearch.addTextChangedListener(mFilterTextWatcher);
            mSearch.requestFocus();
            mSearch.postDelayed(new Runnable() {
                @Override
                public void run() {
                    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
                }
            }, 200);

            break;
    }
    return true;
}

action_search.xml

<?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="@string/search" />

【问题讨论】:

    标签: android android-actionbar menuitem


    【解决方案1】:

    解决方案是将片段嵌套在 Activity 中。

    public class ProductListActivity extends SherlockFragmentActivity {
        …
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) {
                ProductListFragment list = new ProductListFragment();
                getSupportFragmentManager().beginTransaction().add(android.R.id.content, list).commit();
            }
        }
    
        public static class ProductListFragment extends SherlockListFragment {
            …
        }
    } 
    

    【讨论】:

    • 对于除了你自己以外的任何读者来说,这没有任何意义。碎片是从哪里来的?
    • 原来片段是一个单独的类文件。所以我将它嵌套在 Activity 类中
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 2018-02-10
    • 1970-01-01
    相关资源
    最近更新 更多