如何在ActionBar中将文本输入到我的Android SearchView中时如何判断

时间:2013-05-16 10:56:10

标签: android android-menu searchview android-search

我想在用户输入搜索文本时禁用我的应用的某些功能。我的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中的事实有关?无论如何,我仍然是一个强有力的解决方案。

2 个答案:

答案 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();