首页 文章

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

提问于
浏览
76

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

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

有任何想法吗?

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

11 回答

  • 0

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

    inside onquerytextsubmitted {

    searchView.clearfocus()

    }

  • 1

    你需要两次调用setIconified .

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

  • 37

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

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

    searchView.setOnQueryTextFocusChangeListener().
    

    显示或隐藏键盘时会调用 OnQueryTextFocusChangeListener . 在显示键盘并且搜索视图具有焦点时首先调用 . 当 keyboard 被隐藏并且搜索视图将失去焦点时再次被调用,然后可以使用.2807639_

    menuItem.collapseActionView().
    
  • 2

    刚刚覆盖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”作为活动的全局变量 .

  • 1

    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));
    
  • 0

    您只需要在菜单布局中放置“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”来关闭键盘 .

  • 10

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

    这是可以实现的:

    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更正确,因为它描述了更准确地提交文本的事件 .

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

相关问题