2013-03-05 106 views
11

我们已将ActionBar上的SearchView设置为非图标化。由于我们在视图中没有任何内容,除非用户输入了要搜索的内容,因此给予SearchView初始焦点并确保软键盘显示准备好供用户输入文本是有意义的 - 否则,我总是必须先点击SearchView。在ActionBar上显示SearchView的软键盘

我可以只调用

searchView.requestFocus(); 

给搜索查看焦点,但我不能让软键盘出现。在我们的片段的另一个我,我们要集中我可以得到软键盘出现在那里通过调用

InputMethodManager mgr = (InputMethodManager)getActivity().getSystemService(
      Context.INPUT_METHOD_SERVICE); 
mgr.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT); 

一个EditText但这只是不会对搜索查看工作。肯定有可能让这个工作。

+0

试试:http://stackoverflow.com/a/39635722/2535875 – 2016-09-22 10:05:22

回答

22

各地的StackOverflow进一步翻找,我发现这样一个问题:

Forcing the Soft Keyboard open

其中包含了工作的解决方案me:

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

这为我获得了键盘,但如果在onCreateOptionsMenu()中做这件事,我必须保留一个标志来确保我只运行一次这个代码。否则,在您提交搜索后,键盘会再次弹出。 – user291701 2013-09-15 14:39:37

+1

我有同样的问题,并发现在这里SearchView解决方案有帮助:http://stackoverflow.com/questions/12022715/unable-to-show-keyboard-automatically-in-the-searchview – 2014-08-28 15:06:36

+1

这是没用的,如果你有2个视图可以允许键盘输入?您需要更多的键盘才能将文本发送到正确的视图。 – mskw 2014-10-24 15:23:31

1

试图附加onFocusChangeListenerSearchView - 它为我工作了EditText

searchView.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
     @Override 
     public void onFocusChange(View v, boolean hasFocus) { 
      if (hasFocus) { 
       activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 
      } 
     } 
    }); 

还要确保在XML上有SearchView没有要求重点标记,否则你的听众不会叫做。

+0

这也不起作用。正如我在问题中所说的那样,我可以让软键盘在不同的片段上显示,我们有一个EditText,这意味着有一个关于它是一个“特殊”的SearchView,或者是关于它在ActionBar中的“特殊”。 – 2013-03-05 13:26:12

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

    }); 
6

我使用与setIconifiedByDefault(假)搜索查看。使用Android 4.4.2进行测试,我可以让键盘实际显示的唯一方法是查看SearchView的源代码并模仿它要求显示键盘的方式。我尝试了其他所有可以找到/想到的方法,并且这是让键盘可靠显示的唯一方法。不幸的是,我的方法需要一些反思。

在onCreateOptionsMenu(菜单):

searchView.requestFocus(); 
searchView.post(new Runnable() { 
    @Override 
    public void run() { 
     showSoftInputUnchecked(); 
    } 
}); 

然后创建调用隐藏方法 “showSoftInputUnchecked” 在InputMethodManager的方法:

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打破。

+0

谢谢!有用! – 2014-07-26 05:57:50

+0

有效的唯一答案。 Android上的软键盘情况有多悲伤?这是可悲的。 – 2015-04-21 02:45:06

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

我有一个类似的问题,其中没有提出的解决方案在这里工作。有些只是没有让键盘显示出来,有些显示出键盘,但是键盘按键不起作用。

是工作的唯一的事情就是:

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