2

我想在用户输入文本进行搜索时禁用我的应用程序的某些功能。我的 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 中,以防发生一些我没有考虑到的行为(例如按下后退按钮,活动被暂停),并且不知何故状态变量变得陈旧,因此禁用的功能保持禁用状态。所以我正在寻找一种强大的方法来做到这一点,所有帮助都表示赞赏:-)。

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

4

2 回答 2

4

它就在那里。

mySearchView.setOnQueryTextListener(new OnQueryTextListener() {
    @Override
    public boolean onQueryTextChange(String newText) { return false; }

您将在此处获取 SearchView 中文本更改的更新。

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

如果 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.

}
于 2013-05-16T11:02:52.840 回答
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();
于 2013-05-16T12:42:05.867 回答