2012-03-09 73 views
74

我目前使用ActionBar菜单项在操作栏中显示SearchView。当搜索菜单项被展开时,软键盘被显示,这是我想要的。现在,当用户按下后退按钮关闭软键盘时,我还想在操作栏中折叠SearchView。软键盘上的自动折叠ActionBar SearchView关闭

我已经尝试在MenuItem和ActionView上实现以下监听器OnKeyListener和OnFocusChangeListener。我也尝试在Activity中使用OnBackPressed()。以上都未检测到使用后退按钮关闭软键盘时的情况。

任何想法?

我已经实现了OnActionExpandListener以了解SearchView何时可见。

+0

这是一个非常受欢迎的答案http://stackoverflow.com/questions/1109022/how-to-close-hide-the-android-soft-keyboard – jmishra 2012-03-09 05:26:26

+2

它不会帮助他,他需要拦截后面键盘上的键 – dor506 2012-03-09 06:05:17

+2

这个答案应该很有名。还有很多其他答案需要大量的复杂和变通办法,但这些办法可能并不总是可以实现的。我感谢你的问题和答案。这正是我所需要的。我希望你能得到更多的赞扬,你应得的。 – acrespo 2014-07-01 20:58:38

回答

36

我找到了一个更好的解决方案。

searchView.setOnQueryTextFocusChangeListener(). 

OnQueryTextFocusChangeListener显示或隐藏键盘的时候被调用。当键盘显示并且搜索视图将具有焦点时,首先调用。获取再次调用时keyboard隐藏和搜索视图将失去焦点,可以close search view然后使用

menuItem.collapseActionView(). 
+4

这是误导。当键盘显示或隐藏时,“OnQueryTextFocusChangeListener”不会被调用。它只有在'searchView'进入焦点和/或焦点时才被调用。所以,当“SearchView”首次成为焦点时,“OnQueryTextFocusChangeListener”被调用并且键盘也被显示出来。现在,如果后退按钮被按下,键盘被隐藏,但OnQueryTextFocusChangeListener不会被调用。再次按下后退按钮时,searchView会折叠并调用OnQueryTextFocusChangeListener。 – faizal 2013-12-18 11:52:21

10

只重写onBackPressed这样的:

@Override 
    public void onBackPressed() { 
     if (searchView.isShown()){ 
      searchView.onActionViewCollapsed(); //collapse your ActionView 
      searchView.setQuery("",false);  //clears your query without submit 
      isClosed = true;      //needed to handle closed by back 
     } else{ 
      super.onBackPressed(); 
     } 
    } 

和你onCreateOptionsMenu会膨胀mSearchView这样的:

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     super.onCreateOptionsMenu(menu); 
     getMenuInflater().inflate(R.menu.menu_search, menu); 
     mSearchView = (SearchView) menu.findItem(R.id.menu_action_search).getActionView(); 
     mSearchView.setOnQueryTextListener(this); 
     mSearchView.setOnSearchClickListener(this); 
     mSearchView.setOnCloseListener(this); 
     isClosed = true; 
     return true; 
    } 

你们班有这样的实施:

public class myActivity extends FragmentActivity implements 
    SearchView.OnQueryTextListener, View.OnClickListener, SearchView.OnCloseListener { 

,你还需要:

@Override 
public void onClick(View view) { 
    isClosed = false; 
} 

@Override 
public boolean onClose() { 
    isClosed = true; 
    return false; 
} 

您将需要“mSearchView”和活动“isClosed”两个全局变量。

+3

我不认为这是有效的;在我的经验中,如果键盘启动,则不会调用onBackPressed方法;它只是关闭键盘,你需要再次按回来调用该方法。这是2.3;我还没有用3.x和4.0进行过实验,但我怀疑这是一样的。 – Kevlar 2012-04-26 22:33:47

+0

@Kevlar我想你可能是对的。我会再次测试,并确保没有办法。似乎我的解决方案与他们想要的略有不同。据我所知,在显示软键盘时,我不认为有办法处理背部。我的解决方案在键盘关闭后进行处理。将测试不同的SDK。 – Codeversed 2012-05-01 07:32:13

+1

我曾尝试折叠搜索使用:searchMenuItem.collapseActionView();但事实证明searchView.onActionViewCollapsed();为我做了诡计 - 谢谢! – bkurzius 2013-02-28 21:38:02

97

我会对@ user1258568的懒惰答案进行扩充。这对我有效。请注意,它会在焦点丢失时清除您的查询。

final MenuItem searchMenuItem = optionsMenu.findItem(R.id.search); 
final SearchView searchView = (SearchView) searchMenuItem.getActionView(); 

searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View view, boolean queryTextFocused) { 
     if(!queryTextFocused) { 
      searchMenuItem.collapseActionView(); 
      searchView.setQuery("", false); 
     } 
    } 
}); 
+1

完美地工作。如果你在代码中添加一个searchView,你可能需要使用'menu.getItem(yourSearchViewItemPosition)'代替。 – GeeF 2013-02-05 14:05:10

+1

三星Galaxy S 3不工作 – 2013-09-04 06:22:37

+0

@AlexBonel如何?我知道S3和S4拥有白痴硬件按钮,但我不清楚这将如何影响此片段。 也许这是因为ActionBar菜单被隐藏,searchMenuItem的行为不同。 我手边有S4,我必须测试一下。 – 2013-09-04 17:16:49

1

这就是我为了让键盘消失所做的。你可以尝试看看这是否适合你。我将searchView设置为不可见,然后再次可见。

//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 
      */ 
        searchView.setVisibility(View.INVISIBLE); 
        searchView.setVisibility(View.VISIBLE); 
      return false; 
     } 

    }); 
+0

这只为我工作。 :) – 2013-10-11 08:21:47

+0

也为我工作,但您必须添加getActivity()。supportInvalidateOptionsMenu();恢复操作吧 – almisoft 2013-12-11 11:37:51

0
@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getSupportMenuInflater().inflate(R.menu.home_screen, menu); 

     SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); 
     final MenuItem searchMenuItem = menu.findItem(R.id.menu_search); 
     final SearchView searchView = (SearchView) searchMenuItem 
       .getActionView(); 
     searchView.setIconifiedByDefault(false); 
     if (searchManager != null && searchView != null) { 
      searchView.setSearchableInfo(searchManager 
        .getSearchableInfo(getComponentName())); 

      searchView 
        .setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { 

         @Override 
         public void onFocusChange(View v, boolean hasFocus) { 

          if (!hasFocus) { 
           if (searchMenuItem != null) { 
            searchMenuItem.collapseActionView(); 
           }// end if 
           if (searchView != null) { 
            searchView.setQuery("", false); 

           }// end if 
          }// end if 

         } 
        }); 

      searchView 
        .setOnQueryTextListener(new SearchView.OnQueryTextListener() { 

         @Override 
         public boolean onQueryTextSubmit(String query) { 
          /** 
          * hides and then unhides search tab to make sure 
          * keyboard disappears when query is submitted 
          */ 
          if (searchView != null) { 
           searchView.setVisibility(View.INVISIBLE); 
           searchView.setVisibility(View.VISIBLE); 

          } 
          return false; 
         } 

         @Override 
         public boolean onQueryTextChange(String newText) { 
          // TODO Auto-generated method stub 
          return false; 
         } 
        }); 

     } 

     return super.onCreateOptionsMenu(menu); 
    } 
1

这是可以实现的是这样的:基于setOnQueryTextFocusChangeListener(),因为事件没有推出,我没有工作

private void setupSearchView(Menu menu) { 
     final MenuItem searchMenuItem = menu.findItem(R.id.action_search); 
     final SearchView searchView = (SearchView) searchMenuItem.getActionView(); 

     [...] 

     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       searchMenuItem.collapseActionView(); 
       return false; 
      } 
      @Override 
      public boolean onQueryTextChange(String newText) { 
       return true; 
      } 
     }); 
    } 

解决方案 - 将搜索查看丝毫不输提交时集中,可能因为我在包含搜索视图的同一活动中执行搜索。

无论如何,我认为使用OnQueryTextListener更准确,因为它更准确地描述了提交文本的事件。

2

乔恩威利斯的答案很好。这是对他的回答的改进。

首先,创建一个实现View.OnFocusChangeListener一个新的类:

public class SearchViewFocusListener implements View.OnFocusChangeListener { 

    private final MenuItem mMenuItem; 

    public SearchViewFocusListener(MenuItem menuItem) { 
     mMenuItem = menuItem; 
    } 

    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if (!hasFocus) { 
      mMenuItem.collapseActionView(); 
      if (v instanceof SearchView) { 
       ((SearchView) v).setQuery("", false); 
      } 
     } 
    } 

} 

接下来,设置监听你的SearchView

searchView.setOnQueryTextFocusChangeListener(new SearchViewFocusListener(menuItem)); 
0

如果您想在用户点击键盘上的搜索图标可折叠键盘 这可以通过简单的实现

inside onquerytextsubmitted {

searchView.clearfocus()

}

0

你需要调用setIconified两次。

要实际折叠您的搜索视图并关闭键盘。
使用第二个呼叫键盘清除搜索视图的第一个呼叫文本,并关闭搜索视图。

0

出于某种原因,menuItem.collapseActionView()没有工作,所以我用searchView.setIconified(true)代替。

这给出了下面的结果作为代码示例。

final MenuItem searchItem = (MenuItem) menu.findItem(R.id.menu_item_search); 
final SearchView searchView = (SearchView) searchItem.getActionView(); 

searchView.setOnQueryTextFocusChangeListener(new SearchView.OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     if (!hasFocus) { 
      searchView.setIconified(true); 
     } 
    } 
}); 
2

你只需把“collapseActionView”属性菜单布局

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:app="http://schemas.android.com/apk/res-auto"> 
    <item 
     android:id="@+id/menu_item_search" 
     android:title="@string/search" 
     android:iconifiedByDefault="true" 
     android:icon="@drawable/ic_action_search" 
     app:actionViewClass="android.support.v7.widget.SearchView" 
     app:showAsAction="ifRoom|collapseActionView"/> <--this one 
</menu> 

这会给你你通过itself.Don't寻找所有功能忘记调用方法“清除焦点“在SearchView上关闭键盘,一旦你发送查询。