软键盘上的自动折叠ActionBar SearchView关闭

use*_*568 76 android android-softkeyboard android-actionbar

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

我尝试在MenuItem和ActionView上实现以下侦听器OnKeyListener和OnFocusChangeListener.我也尝试在Activity中使用OnBackPressed().以上都没有检测到后退按钮用于关闭软键盘的时间.

有任何想法吗?

我已经实现了OnActionExpandListener来了解SearchView何时可见.

Jon*_*lis 99

我将扩展@ 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);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 尼斯,之后的研究和实施时间,试图做到这一点,我发现你的答案:) ...我想的第一件事是使用一个焦点侦听器,但我用`setOnFocusChangeListener()`,而不是`setOnQueryTextFocusChangeListener()`.用你的方法一切都很好.谢谢. (4认同)
  • @IonutNegru,欢迎你!有时候会喜欢Android SDK.我想看到他们以一种理智,现代的方式重写它并放弃遗产支持,但这绝不会发生. (2认同)

use*_*568 37

我找到了更好的解决方案.

searchView.setOnQueryTextFocusChangeListener(). 
Run Code Online (Sandbox Code Playgroud)

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

menuItem.collapseActionView().
Run Code Online (Sandbox Code Playgroud)

  • 这是误导.当显示或隐藏键盘时,不会调用`OnQueryTextFocusChangeListener`.只有当`searchView`成为焦点或失焦时才会调用它.因此,当`SearchView`第一次聚焦时,调用`OnQueryTextFocusChangeListener`并显示键盘.现在,如果按下后退按钮,键盘将被隐藏,但不会调用`OnQueryTextFocusChangeListener`.在第二次按下后退按钮时,`searchView`崩溃并调用`OnQueryTextFocusChangeListener`. (4认同)

Cod*_*sed 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

你的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;
    }
Run Code Online (Sandbox Code Playgroud)

你有没有像下面这样实现以下内容:

public class myActivity extends FragmentActivity implements
    SearchView.OnQueryTextListener, View.OnClickListener, SearchView.OnCloseListener {
Run Code Online (Sandbox Code Playgroud)

您还需要:

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

@Override
public boolean onClose() {
    isClosed = true;
    return false;
}
Run Code Online (Sandbox Code Playgroud)

您需要将"mSearchView"和"isClosed"作为活动的全局变量.

  • 我不认为这有效; 根据我的经验,如果键盘已启动,则不会调用onBackPressed方法; 它只是取消键盘,你需要再次按回来让它调用该方法.这是2.3; 我没有尝试3.x和4.0,但我怀疑这也是一样的. (3认同)