Android how to focus ActionBar searchView

AndroidAndroid Widget

Android Problem Overview


Hello i need to put some text inside the searchView and focus/expand the searchView widget.

this is what i tried but it doesn't work

@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 Solutions


Solution 1 - Android

Try using searchView.setIconified(false). This worked for me:

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

Solution 2 - Android

Here is another solution.

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

Solution 3 - Android

This works for me:

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

Solution 4 - Android

For me the following works:

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

I use android.support.v7.widget.SearchView. When tried to set mSearchView.setIconified(false); it entered into an infinite loop.

Solution 5 - Android

searchView.setQuery("typeAnything",true);
searchView.setFocusable(true);

will do the trick.

Solution 6 - Android

public void setIconified(boolean iconify) {
    if (iconify) {
        onCloseClicked();
    } else {
        onSearchClicked();
    }
}

this is code in SearchView

setIconified() is worked for me

Solution 7 - Android

In the activity xml you can use this line:

android:iconifiedByDefault="false"

Solution 8 - Android

In case SearchView is made by menu configuration, I expand the action view using menu item.

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

Solution 9 - Android

I implemented it in onCreateOptionMenu and it worked. You don't need to using 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;
    }

Solution 10 - Android

use MenuItem's 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
    }

you need to add this line:

menuItemSearch?.expandActionView()

Solution 11 - Android

For me, the approach from @farmer.chs only worked after I added a delay:

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
 super.onViewCreated(view, savedInstanceState)

 activity?.let {
            searchBar?.postDelayed({
                  searchBar.isIconified = false
                  searchBar.isFocusable = true
                  searchBar.requestFocusFromTouch()
            }, 100)
        }

P.S. this code is called in the Fragment

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionmax4everView Question on Stackoverflow
Solution 1 - Androidfarmer.chsView Answer on Stackoverflow
Solution 2 - AndroidOwen ZhaoView Answer on Stackoverflow
Solution 3 - AndroidErick MartinezView Answer on Stackoverflow
Solution 4 - AndroidCoolMindView Answer on Stackoverflow
Solution 5 - AndroidSaqib R.View Answer on Stackoverflow
Solution 6 - Android小三爷View Answer on Stackoverflow
Solution 7 - AndroidRadioactiveRadiumView Answer on Stackoverflow
Solution 8 - AndroidBrownsoo HanView Answer on Stackoverflow
Solution 9 - AndroidHai HackView Answer on Stackoverflow
Solution 10 - AndroidNoel ChewView Answer on Stackoverflow
Solution 11 - AndroidtasjaprView Answer on Stackoverflow