软键盘上的自动折叠动作栏搜索视图关闭

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

我尝试在 MenuItem 和 ActionView 上实现以下监听器 OnKeyListener 和 OnFocusChangeListener。我还尝试过在活动中使用 OnBackPress ()。以上都没有检测到什么时候后退按钮是用来关闭软键盘。

有什么想法吗?

我已经实现了 OnActionExpandListener 来知道 SearchView 何时可见。

38621 次浏览

我找到了更好的解决办法。

searchView.setOnQueryTextFocusChangeListener().

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

menuItem.collapseActionView().

就像这样覆盖:

@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”和“ isClose”这两个全局变量设置为活动。

我将在@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);
}
}
});

这就是我让键盘消失的方法。你可以试试看这样行不行。我将 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;
}


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

这是可以实现的:

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

基于 setOnQueryTextFocusChangeListener ()的解决方案对我不起作用,因为事件没有启动—— searchView 在提交时没有失去焦点,可能是因为我在包含 Search View 的同一个活动中执行搜索。

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

乔恩 · 威利斯的回答很有效,这是对他的回答的一个改进。

首先,创建一个实现 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));

如果要在用户单击键盘上的搜索图标时折叠键盘 这可以通过简单的

inside onquerytextsubmitted {

searchView.clearfocus()

}

你需要调用 setIconfied 两次。

实际折叠搜索视图并关闭键盘。
随着第一个呼叫文本的搜索视图是清除与第二个呼叫键盘和搜索视图得到关闭。

由于某种原因,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);
}
}
});

您只需要在菜单布局中放置“坍塌 ActionView”属性

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

这将为您提供所需的所有功能。不要忘记在 SearchView 上调用方法“ clearFocus”,以便在发送查询后关闭键盘。