软键盘上的自动折叠ActionBar SearchView关闭

时间:2012-03-09 05:21:32

标签: android android-actionbar android-softkeyboard

我目前正在使用ActionBar菜单项在操作栏中显示SearchView。当搜索菜单项被展开时,显示软键盘,这就是我想要的。现在,当用户按下后退按钮关闭软键盘时,我还想在操作栏中折叠SearchView。

我尝试在MenuItem和ActionView上实现以下侦听器OnKeyListener和OnFocusChangeListener。我也尝试在Activity中使用OnBackPressed()。以上都没有检测到后退按钮用于关闭软键盘的时间。

有什么想法吗?

我已经实现了OnActionExpandListener来了解SearchView何时可见。

11 个答案:

答案 0 :(得分:98)

我将扩展@ 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);
        }
    }
});

答案 1 :(得分:37)

我找到了更好的解决方案。

searchView.setOnQueryTextFocusChangeListener(). 

显示或隐藏键盘时会调用OnQueryTextFocusChangeListener。在显示键盘并且搜索视图具有焦点时首先调用。隐藏keyboard并且搜索视图失去焦点时再次调用,close search view然后使用

menuItem.collapseActionView().

答案 2 :(得分:10)

像这样覆盖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”作为活动的全局变量。

答案 3 :(得分:2)

Jon Willis的回答非常好。这是对他答案的改进。

首先,创建一个实现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));

答案 4 :(得分:2)

您只需要在菜单布局中放置“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>

这将为您提供您自己寻找的功能。在发送查询后,不要忘记在SearchView上调用方法“clearFocus”来关闭键盘。

答案 5 :(得分:1)

这是我为使键盘消失所做的。您可以尝试查看这是否适合您。我将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;
        }

     });

答案 6 :(得分:1)

这样可以实现:

   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()的解决方案对我不起作用,因为事件未启动 - searchView在提交时没有失去焦点,可能是因为我在包含搜索视图的同一活动中执行搜索。

无论如何,我认为使用OnQueryTextListener更为正确,因为它描述了更准确地提交文本的事件。

答案 7 :(得分:0)

@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);
    }

答案 8 :(得分:0)

如果您想在用户点击键盘上的搜索图标时折叠键盘 这可以通过简单的

来实现

inside onquerytextsubmitted {

searchView.clearfocus()

}

答案 9 :(得分:0)

您需要两次调用setIconified。

实际折叠搜索视图并关闭键盘  使用第二个呼叫键盘清除搜索视图的第一个呼叫文本,并关闭搜索视图。

答案 10 :(得分:0)

出于某种原因,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);
        }
    }
});