如何在后退时以编程方式关闭SearchView?

时间:2016-10-27 06:54:30

标签: android

我有同样的问题,我发现here我将重新进行迭代,因为解决方案并非100%完全符合我的要求:

  

我目前在我的应用的操作栏中有一个SearchView。当我单击搜索图标时,SearchView会展开,键盘会按预期弹出。单击SearchView框中的“X”将按预期关闭SearchView。但是,当SearchView被激活并按下“后退”按钮时,我的应用程序将退出。这是正确的行为,但我现在要做的是捕获按钮按下按钮,当SearchView可见时,让它关闭SearchView(不是我的应用程序)。有没有办法按后退按钮以编程方式调用SearchView OnCloseListener()?例如,像这样:

以下是解决方案:

@Override
public void onBackPressed() {
  if (!searchView.isIconified()) {
    searchView.setIconified(true);
  } else {
    super.onBackPressed();
  }
}

问题在于解决方案要求用户按不是一次,而是两次一次*退出键盘,** ** 关闭SearchView。< / p>

如何通过按一次来同时关闭键盘 SearchView?

修改

Somone与EditText有类似的问题,解决方法是继承EditText视图。

8 个答案:

答案 0 :(得分:1)

@Override
public void onBackPressed() {    
    if (!searchView.isIconified()) {
        searchView.setIconified(true);
        searchView.onActionViewCollapsed()
    } else {
        super.onBackPressed();
    }
}

下面的方法是仅清除您的文本

searchView.setIconified(true); 

下面的这种方法关闭了您的搜索视图

searchView.onActionViewCollapsed()

答案 1 :(得分:0)

尝试

@Override
public void onBackPressed() {

View view = this.getCurrentFocus();
if (view != null) {  
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
if (!searchView.isIconified()) {
    searchView.setIconified(true);
} else {
    super.onBackPressed();
}
}

答案 2 :(得分:0)

onBackPressed()内添加关闭键盘的方法 这是隐藏键盘的代码。

private void hideKeyboard() {
InputMethodManager imm = (InputMethodManager) 
    getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mInputField.getWindowToken(), 0);
}

答案 3 :(得分:0)

根据@Archana的回答,onBackPressed()应该是:

@Override
public void onBackPressed() {    
    hideSoftKeyboard();
    if (!searchView.isIconified()) {
        searchView.setIconified(true);
    } else {
        super.onBackPressed();
    }
}

private void hideSoftKeyboard(){
    View view = activity.getCurrentFocus ();
    if (view != null) {
        InputMethodManager imm = (InputMethodManager) activity.getSystemService (Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow (view.getWindowToken (), 0);
    }
}

或者您也可以覆盖onKeyDown()

@Override
public boolean onKeyDown (int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        hideSoftKeyboard ();
        if (! searchView.isIconified ()) {
            searchView.setIconified (true);
        } 
        return true;
    }
    return super.onKeyDown (keyCode, event);
}

private void hideSoftKeyboard() {
    View view = activity.getCurrentFocus ();
    if (view != null) {
        InputMethodManager imm = (InputMethodManager) activity.getSystemService (Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow (view.getWindowToken (), 0);
    }
}

答案 4 :(得分:0)

一个有趣的答案!

 @Override
    public void onBackPressed() {
      if (!searchView.isIconified()) {
        searchView.setIconified(true);
        searchView.setIconified(true);
      } else {
        super.onBackPressed();
      }
    }

答案 5 :(得分:0)

public class MainActivity extends AppCompatActivity {
    MenuItem menuItemSearch;

    @Override
    protected void onResume() {
      if(menuItemSearch!=null)
        MenuItemCompat.collapseActionView(menuItemSearch);  // while activity begins, searchView is closed if remained open.
    }

    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
      menuItemSearch = menu.findItem(R.id.menuSearch);
    }
}

答案 6 :(得分:0)

我在SearchView所在的活动中这样做了

@Override
    public void onBackPressed() {
        super.onBackPressed();
        if (!searchView.isIconified()) {
            searchView.setIconified(true);
        }
    }

答案 7 :(得分:0)

尝试使用clearFocus()方法来代替手动隐藏软键盘

mSearchView.setIconified(true);
mSearchView.clearFocus();