在ActionBar上显示SearchView软键盘

15
我们在ActionBar上有一个SearchView,它被设置为非图标化。由于在用户输入搜索内容之前,视图中没有任何内容,因此让SearchView具有初始焦点并确保软键盘已准备好供用户输入文本是有意义的,否则他们总是需要先点击SearchView。

我可以通过调用以下代码来使SearchView具有焦点

searchView.requestFocus();

但是我无法让软键盘出现。在我们的另一个片段中,我们有一个EditText,我们希望它获得焦点,通过调用 可以 在那里使软键盘出现。
InputMethodManager mgr = (InputMethodManager)getActivity().getSystemService(
            Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);

但是在SearchView上这并不起作用。肯定有办法让它起作用。

试一下:https://dev59.com/rGct5IYBdhLWcg3wh91K#39635722 - Md Imran Choudhury
8个回答

22

在 StackOverflow 上进一步搜索,我找到了这个问题:

强制打开软键盘

其中包含一个对我有效的解决方案:

((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).
    toggleSoftInput(InputMethodManager.SHOW_FORCED,
                    InputMethodManager.HIDE_IMPLICIT_ONLY);

这个代码可以让我打开键盘,但是如果在onCreateOptionsMenu()中执行它,我必须要设置一个标志位来确保只运行一次。否则,当你提交搜索后,键盘会不断弹出。 - user291701
1
我曾经遇到同样的问题,并在这里找到了SearchView解决方案:https://dev59.com/rGct5IYBdhLWcg3wh91K - David Douglas
1
这是无用的,如果您有两个视图可以允许键盘输入会发生什么?您需要更多的内容才能使键盘将文本发送到正确的视图。 - mskw

10

我有一个类似的问题,这里提出的解决方案都没有起作用。有些根本没有显示键盘,有些显示了键盘但按键无任何反应。

唯一有效的方法是:

                    // hack for making the keyboard appear
                    searchView.setIconified(true);
                    searchView.setIconified(false);

6
我正在使用一个SearchView,并使用setIconifiedByDefault(false)。在Android 4.4.2上进行测试,我必须查看SearchView的源代码,并模仿其请求键盘显示的方式才能让键盘真正显示出来。我尝试了几乎所有其他我能找到/想到的方法,但这是我唯一可靠地让键盘显示的方法。不幸的是,我的方法需要一些反射。
在onCreateOptionsMenu(Menu)中:
searchView.requestFocus();
searchView.post(new Runnable() {
    @Override
    public void run() {
        showSoftInputUnchecked();
    }
});

然后创建一个方法来调用InputMethodManager中隐藏的方法"showSoftInputUnchecked":

private void showSoftInputUnchecked() {
    InputMethodManager imm = (InputMethodManager)
            getSystemService(Context.INPUT_METHOD_SERVICE);

    if (imm != null) {
        Method showSoftInputUnchecked = null;
        try {
            showSoftInputUnchecked = imm.getClass()
                    .getMethod("showSoftInputUnchecked", int.class, ResultReceiver.class);
        } catch (NoSuchMethodException e) {
            // Log something
        }

        if (showSoftInputUnchecked != null) {
            try {
                showSoftInputUnchecked.invoke(imm, 0, null);
            } catch (IllegalAccessException e) {
                // Log something
            } catch (InvocationTargetException e) {
                // Log something
            }
        }
    }
}

与所有访问非公共API的解决方案一样,我不能保证这不会在新版本的Android中出现问题。


唯一可行的答案。安卓软键盘的情况有多糟糕?太可悲了。 - Greg Ennis

0

这将不会在每次进入活动时显示键盘

searchview.clearFocus();


0
如果你想要显示软键盘并将焦点放在输入框上,可以尝试:
final MenuItem menuItem = menu.findItem(R.id.action_search);
menuItem.expandActionView();//expand show soft keyboard

 <item
    android:id="@+id/action_search"
    android:icon="@drawable/ic_actionbar_search"
    liven:showAsAction="collapseActionView|always" //always
    liven:actionViewClass="android.support.v7.widget.SearchView" />enter code here

0

这对我有用。

private SearchView mSearchView;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);

    SearchManager searchManager =
            (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    mSearchView =
            (SearchView) searchItem.getActionView();
    mSearchView.setSearchableInfo(
            searchManager.getSearchableInfo(getComponentName()));

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.action_search) {
        mSearchView.setIconifiedByDefault(true);
        mSearchView.setFocusable(true);
        mSearchView.setIconified(false);
        mSearchView.requestFocusFromTouch();
    }

    return super.onOptionsItemSelected(item);
}

-1
使用 expandView 方法: 您的 onCreateOptionsMenu 可能是这样的:
         @Override                                                                                                     
       public boolean onCreateOptionsMenu(Menu menu) {                                                          
 //Used to put dark icons on light action bar                                                              

     final SearchView searchView = new SearchView(getSupportActionBar().getThemedContext());                   


       MenuItem mitem = menu.add("Search");                                                                  

       mitem.setIcon(ic_search_inverse)                                                                      
            .setActionView(searchView)                                                                       
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW);

        mitem.expandActionView();                                                      

        listsearch.setOnItemClickListener(this);                                                             

 return     true;                                                                                              
      }  

-2

你可以尝试我做的。这对我很有效。

    //set query change listener
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
        @Override
        public boolean onQueryTextChange(String newText) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean onQueryTextSubmit(String query) {
            /**
             * hides and then unhides search tab to make sure keyboard disappears when query is submitted
             * 4 = INVISIBLE
             * 0 = VISIBLE
             */
                  searchView.setVisibility(4);
                  searchView.setVisibility(0);
            return false;
        }

     });  

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