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

我如何判断文本何时被输入到ActionBar上的Android SearchView中,android,android-menu,searchview,android-search,Android,Android Menu,Searchview,Android Search,我想在用户输入搜索文本时禁用我的应用程序的某些功能。my ActionBar中相关项的xml为 <item android:id="@+id/actionbar_search" android:orderInCategory="1" android:showAsAction="always|withText|collapseActionView" android:actionViewClass="android.widget.SearchView" andr

我想在用户输入搜索文本时禁用我的应用程序的某些功能。my 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" />
我浏览了SearchView上的方法,但没有看到任何可以告诉我它是否处于活动状态的内容。我还担心输入一个布尔状态变量来指示文本何时被输入SearchView,以防出现一些我没有考虑到的行为(例如,按下后退按钮,活动被暂停),并且状态变量不知何故变得过时,从而使禁用的功能保持禁用状态。因此,我正在寻找一种强大的方法来实现这一点,感谢所有的帮助:-)

更新。下面的答案建议使用接口
OnFocusChangeListener
,该接口由mySearchView对象和/或mySearchView.isFocused()方法实现。这两种方法听起来都很有希望,但我现在已经测试过了,两种方法似乎都不起作用。也许他们的失败与这个SearchView在ActionBar中的事实有关?无论如何,我仍然在寻找一个可靠的解决方案。

它就在那里

mySearchView.setOnQueryTextListener(new OnQueryTextListener() {
    @Override
    public boolean onQueryTextChange(String newText) { return false; }
在这里,您可以在SearchView中获得文本更改的更新

返回值应该是这样的():

返回 如果SearchView应执行显示任何建议(如果可用)的默认操作,则为false;如果该操作由侦听器处理,则为true

如果您想知道SearchView是否已被激活或停用,请使用


由于监视焦点不起作用,我再次查看了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()中启用和禁用活动的视图。您应该在活动中保留MenuItem,以便在onResume()中查询它,如下所示:

这部分可能不需要。当活动被隐藏时,SearchView可能会自动折叠并保持这种状态,因此您只需在onResume()中调用enableInteraction(),这样您的用户就不会被锁定

如果您只需要引用SearchView的状态,请使用

searchViewMenuItem.isActionViewExpanded();

事实上,我想在使用时禁用一些东西,我想这意味着聚焦,所以OnFocusChangeListener.onFocusChange听起来很有希望,但OnQueryTextListener.onQueryTextChange对我没有帮助。但是要使用OnFocusChangeListener.onFocusChange,我需要设置一个状态变量来记录对该方法的调用,正如我在问题中所说的,我担心状态变量会与实际发生的情况不同步。是否有任何方式会导致焦点丢失(例如,当电话到达时暂停活动),并且不会调用OnFocusChangeListener?@随机检查onResume()。谢谢,也许我可以测试(mySearchView.findFocus()==null)以确定用户是否处于文本输入模式?刚刚发现您的评论,我将尝试View.IsFocused()。也许如果我称之为我根本不需要状态变量,这会让我更开心:-)。@随机地说,这是我在Android上注意到的一件事。如果您认为需要一个状态变量,那么您没有充分使用API。Android总是有办法获得你需要的信息。奇怪的是,你关于focus的两个非常有希望的建议都没有奏效。我用底部的注释更新了这个问题。我想我可以测试menu.findItem(myid).isActionViewExpanded(),这会让我更高兴,因为我不需要状态变量。是的,menu.findItem(myid).isActionViewExpanded()似乎可以工作:-)。如果你想把这个添加到你的答案中,那么我将把你的答案标记为官方答案:-)。@随机地说,你在做什么?在onQueryTextChange()中,当用户输入搜索文本时,我想禁用应用程序中其他地方的行为。isActionViewExpanded()方法似乎确实反映了这一点,因此我将该MenuItem作为活动的一个属性,并对其进行测试,以确定该行为是否应处于活动状态。正如我所说,这似乎确实有效:-)。
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.
        }
    }
);
@Override
public void onResume(){
    super.onResume();

    searchViewMenuItem.isActionViewExpanded() ? 
    disableInteraction() : enableInteraction();    
}
searchViewMenuItem.isActionViewExpanded();