软键盘上的自动折叠ActionBar SearchViewclosures
我目前正在使用一个ActionBar菜单项来显示一个SearchView在操作栏中。 当search菜单项被展开时,软键盘被显示,这是我想要的。 现在,当用户按下后退buttonclosures软键盘时,我也想在操作栏中折叠SearchView。
我已经尝试在MenuItem和ActionView上实现以下监听器OnKeyListener和OnFocusChangeListener。 我也尝试在Activity中使用OnBackPressed()。 当后退button用于closures软键盘时,以上都没有发现。
有任何想法吗?
我已经实现了OnActionExpandListener来知道什么时候可以看到SearchView。
我会扩展@ 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); } } });
我find了更好的解决scheme。
searchView.setOnQueryTextFocusChangeListener().
当键盘显示或隐藏时, OnQueryTextFocusChangeListener
被调用。 当显示键盘并且search视图将具有焦点时,首先调用。 当keyboard
被隐藏并且search视图将失去焦点时,会再次调用,可以close search view
然后使用
menuItem.collapseActionView().
只是像这样覆盖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”这两个全局variables都设置为该活动。
Jon Willis的回答非常好。 这是对他的回答的改进。
首先,创build一个实现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));
这是我为了使键盘消失所做的。 你可以尝试看看这是否适合你。 我将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; } });
这是可以实现的:
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()的解决scheme不适用于我,因为事件没有启动 – searchView在提交时没有失去焦点,可能是因为我在包含search视图的相同活动中执行search。
无论如何,我认为使用OnQueryTextListener更加正确,因为它更准确地描述了提交文本的事件。
您只需要在菜单布局中放置“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>
这将为您提供所有function。不要忘记在发送查询时,在SearchView上调用“clearFocus”方法closures键盘。
@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); }
如果你想在用户点击键盘上的search图标时折叠键盘,可以通过简单的方式实现
inside onquerytextsubmitted {
searchView.clearfocus()
}
你需要调用setIconified两次。
要实际折叠您的search视图并closures键盘。
search视图的第一个调用文本被第二个调用键盘清除,search视图closures。
出于某种原因, 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); } } });
- Android Webview – 网页应该适合设备屏幕
- Android的FragmentTabHost:没有标签null的标签
- 我如何在Android Studio中创buildtesting?
- 如何在Android上显示可用的通知声音列表
- PreferenceActivity:将值保存为整数
- Android Paint:.measureText()vs .getTextBounds()
- Android adb“无法打开同步连接!”
- NoClassDefFoundError – Eclipse和Android
- 执行任务':app:dexDebug'失败。 com.android.ide.common.process.ProcessException:org.gradle.process.internal.ExecException