【问题标题】:Android how to focus ActionBar searchViewAndroid如何聚焦ActionBar searchView
【发布时间】:2012-04-22 19:36:12
【问题描述】:

您好,我需要在 searchView 中添加一些文本并聚焦/展开 searchView 小部件。

这是我尝试过的,但它不起作用

@Override
public boolean onCreateOptionsMenu(final Menu menu) {
...
    SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    searchView.setQuery(this.filtro, false);
    searchView.setFocusable(true);
    searchView.requestFocus();
    searchView.requestFocusFromTouch();

【问题讨论】:

    标签: android android-widget


    【解决方案1】:

    尝试使用searchView.setIconified(false)。这对我有用:

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        ActionBar actionBar = getActionBar();
        SearchView searchView = new SearchView(this);
        actionBar.setCustomView(searchView);
        actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
        searchView.setQuery("test",true);
        searchView.setFocusable(true);
        searchView.setIconified(false);
        searchView.requestFocusFromTouch();
    }
    

    【讨论】:

    • 整洁。看起来比覆盖 onCreateOptionsMenu 和设置 xmls 干净得多。
    • “但我已经打电话给setIconifiedByDefault(false),”你说。 “这一定不适用于我,”你说。不要像我一样,孩子们。打电话给setIconified(false),而不是追一个小时。
    • 奇怪,但 setIconified(false) 确实能胜任!
    • 干得好!谢谢。
    【解决方案2】:

    这是另一种解决方案。

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main_menu, menu);
        MenuItem menu_search = menu.findItem(R.id.menu_search);
    
    
        menu_search.setOnActionExpandListener(new OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                // Do something when collapsed
                return true;  // Return true to collapse action view
            }
    
            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                //get focus
                item.getActionView().requestFocus();
                //get input method
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
                return true;  // Return true to expand action view
            }
        });
        return true;
    }
    

    【讨论】:

    • 谢谢,伙计!经过数十次其他失败尝试后,只有您的键盘切换方法版本与 ActionBarSherlock 的搜索视图正常工作。
    • item.expandActionView();对我来说已经足够了。 :)
    • 出现异常java.lang.UnsupportedOperationException: This is not supported, use MenuItemCompat.setOnActionExpandListener()之后,我稍微改了一下代码,但什么也没发生。
    【解决方案3】:

    这对我有用:

            @Override
            public boolean onMenuItemActionExpand(MenuItem item)
            {
                if (sm.isMenuShowing()) {
                    sm.toggle();
                }
                searchView.setIconified(true);
                KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, 32);
                searchView.onKeyDown(32, event);
                return true;
            }
    

    【讨论】:

      【解决方案4】:

      对我来说,以下作品:

      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
          ...
          MenuItem miSearch = menu.findItem(R.id.menu_search);
          SearchView mSearchView = (SearchView) miSearch.getActionView();
      
          mSearchView.setOnSearchClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                  mSearchView.setFocusable(true);
                  mSearchView.requestFocusFromTouch();
              }
          });
      

      我使用 android.support.v7.widget.SearchView。当尝试设置mSearchView.setIconified(false); 时,它进入了一个无限循环。

      【讨论】:

      • 这个也对我有用。我正在使用android.support.v7.widget.SearchView 谢谢朋友。两天后,终于有一个答案起作用了! :) 我还加了:searchView.setIconified(false);
      • 谢谢,@Mohsen!是的,你是对的,有时安卓太烦人了。祝你好运!
      【解决方案5】:
      searchView.setQuery("typeAnything",true);
      searchView.setFocusable(true);
      

      会成功的。

      【讨论】:

      • 对我来说这还不够(我使用 android.support.v7.widget.SearchView)。
      【解决方案6】:
      public void setIconified(boolean iconify) {
          if (iconify) {
              onCloseClicked();
          } else {
              onSearchClicked();
          }
      }
      

      这是 SearchView 中的代码

      setIconified() 对我有用

      【讨论】:

        【解决方案7】:

        在活动 xml 中你可以使用这一行:

        android:iconifiedByDefault="false"
        

        【讨论】:

          【解决方案8】:

          如果 SearchView 是通过菜单配置制作的,我使用菜单项展开操作视图。

          private var searchMenuItem: MenuItem? = null
          
          // create search menu item
          override fun onCreateOptionsMenu(menu: Menu?): Boolean {
              menuInflater.inflate(R.menu.search_menu, menu)
              searchMenuItem = menu?.findItem(R.id.action_search)
              val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
              (searchMenuItem?.actionView as? SearchView)?.apply {
                  setSearchableInfo(searchManager.getSearchableInfo(componentName))
              }
              return super.onCreateOptionsMenu(menu)
          }
          
          
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              setContentView(R.layout.activity_search)
              setSupportActionBar(findViewById(R.id.toolbar))
              // Execute 'expandActionView' delayed 
              // because I want to focus field only when first start.
              Handler().postDelayed({
                  // show field and focus it.
                  searchMenuItem?.expandActionView()
              }, 500)
          }
          

          【讨论】:

            【解决方案9】:

            我在 onCreateOptionMenu 中实现了它并且它有效。你不需要使用setIconified(false);

            @Override
                public boolean onCreateOptionsMenu(Menu menu) {
                    getMenuInflater().inflate(R.menu.main, menu);
            
                    // Associate searchable configuration with the SearchView
                    SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
                    searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
                    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
                    searchView.setMaxWidth(Integer.MAX_VALUE);
                    searchView.setOnClickListener(view -> menu.findItem(R.id.action_sleep_timer).setVisible(false));
                    searchView.setOnCloseListener(() -> {
                        menu.findItem(R.id.action_sleep_timer).setVisible(true);
                        return false;
                    });
                    searchView.setOnSearchClickListener(view -> {
                        menu.findItem(R.id.action_sleep_timer).setVisible(false);
                        searchView.requestFocus();
                    });
            return true;
                }
            

            【讨论】:

              【解决方案10】:

              使用 MenuItem 的 expandActionView()

              override fun onCreateOptionsMenu(menu: Menu): Boolean {
                      menuInflater.inflate(R.menu.menu_search, menu)
                      menuItemSearch = menu.findItem(R.id.action_search)
                      searchView = menuItemSearch?.actionView as SearchView
                      // ...
                      menuItemSearch?.expandActionView()
                      return true
                  }
              

              你需要添加这一行:

              menuItemSearch?.expandActionView()
              

              【讨论】:

                【解决方案11】:

                对我来说,@farmer.chs 的方法只有在我添加延迟后才有效:

                 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
                 super.onViewCreated(view, savedInstanceState)
                
                 activity?.let {
                            searchBar?.postDelayed({
                                  searchBar.isIconified = false
                                  searchBar.isFocusable = true
                                  searchBar.requestFocusFromTouch()
                            }, 100)
                        }
                

                附:此代码在 Fragment 中调用

                【讨论】:

                  猜你喜欢
                  • 2011-11-28
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-03-01
                  • 2020-03-25
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多