我想在用户输入搜索文本时禁用我的应用的某些功能。我的ActionBar中相关项的xml是
<item android:id="@+id/actionbar_search"
android:orderInCategory="1"
android:showAsAction="always|withText|collapseActionView"
android:actionViewClass="android.widget.SearchView"
android:icon="@drawable/earth_2508858_search_en"
android:inputType="textPostalAddress" />
以及我目前为满足搜索而提供的相应代码
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.action_menu, menu);
MenuItem DestinationTxt = menu.findItem(R.id.actionbar_search);
final SearchView mySearchView = (SearchView)DestinationTxt.getActionView();
mySearchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String newText) { return false; }
@Override
public boolean onQueryTextSubmit(String query) {
//Hide the Keyboard
imm.hideSoftInputFromWindow(mySearchView.getWindowToken(), 0);
// CODE TO DO THE SEARCH
return true;
}
});
}
我在SearchView上浏览了这些方法,但我没有看到任何可以告诉我它是否有效的方法。我还担心放入一个布尔状态变量来指示何时将文本输入到SearchView中,以防我发生某些行为(例如按下后退按钮,活动被暂停),并且不知何故状态变量变为陈旧,以便禁用的功能保持禁用状态。所以我正在寻找一种强有力的方法来做到这一点,所有的帮助表示赞赏: - )。
更新的。下面的答案建议使用由mySearchView对象和/或mySearchView.isFocussed()方法实现的接口OnFocusChangeListener
。这两个听起来很有希望,但我现在已经测试过,似乎都没有用。也许他们的失败与这个SearchView在ActionBar中的事实有关?无论如何,我仍然是一个强有力的解决方案。
答案 0 :(得分:4)
就在那里。
mySearchView.setOnQueryTextListener(new OnQueryTextListener() {
@Override
public boolean onQueryTextChange(String newText) { return false; }
在这里,您将获得SearchView中文本更改的更新。
返回值应该是这样的(documentation):
返回 如果SearchView应执行显示任何建议(如果可用)的默认操作,则返回false;如果操作由侦听器处理,则为true。
如果您想知道SearchView是否已被激活或停用,请使用View.setOnFocusChangeListener(View.OnFocusChangeListener);
public interface OnFocusChangeListener{
public void onFocusChange (View v, boolean hasFocus);
// The boolean will tell you if it's focused or not.
}
答案 1 :(得分:2)
由于监视焦点不起作用,我再次查看了SearchView文档。这有点令人费解,但似乎是这个问题的预期解决方案。
如果您的SearchView从onCreateOptionsMenu()中的菜单XML中膨胀,那么您可以添加以下行:
menu.findItem(/* your SearchView's ID here */).setOnActionExpandListener(
new OnActionExpandListener(){
@Override
public boolean onMenuItemActionCollapse (MenuItem item){
enableInteraction();
return true; // Allow the SearchView to collapse.
}
@Override
public boolean onMenuItemActionExpand(MenuItem item){
disableInteraction();
return true; // Allow the SearchView to expand.
}
}
);
然后分别在enableInteraction()和disableInteraction()中启用和禁用Activity的视图。您应该在Activity中保留MenuItem,这样您就可以在onResume()中查询它,如下所示:
@Override
public void onResume(){
super.onResume();
searchViewMenuItem.isActionViewExpanded() ?
disableInteraction() : enableInteraction();
}
可能不需要此部分。当隐藏Activity并且保持这种方式时,SearchView可能会自动折叠,因此您只需在onResume()中调用enableInteraction(),这样您的用户就不会被锁定。
如果您只需要引用SearchView的状态,请使用
searchViewMenuItem.isActionViewExpanded();