make the search function on the app bar disappear

Viewed 35

I have an appbar that contains a search, I want to make it appear only in a fragment, not in all as it is happening now. How would I change his visibility?

Main Activity where is it implemented

class MainActivity : AppCompatActivity() {

private lateinit var toggle: ActionBarDrawerToggle
private val controlador by lazy {
    findNavController(R.id.pokemons_activity_nav_host)
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main_activity)
    configNavControler()
    configDrawer()

}


private fun configDrawer() {
    toggle = ActionBarDrawerToggle(this, drawerLayout as DrawerLayout?, R.string.open, 
R.string.close)
    (drawerLayout as DrawerLayout?)?.addDrawerListener(toggle)
    toggle.syncState()

    supportActionBar?.setDisplayHomeAsUpEnabled(true)


}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    if(toggle.onOptionsItemSelected(item)){
        return true
    }
    return super.onOptionsItemSelected(item)
}


private fun configNavControler() {
    val navView: BottomNavigationView = findViewById(R.id.main_activity_bottom_navigation)
    val navHostFragment = supportFragmentManager
        .findFragmentById(R.id.pokemons_activity_nav_host) as NavHostFragment
    val navController = navHostFragment.navController

    navView.setupWithNavController(navController)

    configNavView(navController, navView)   // configura para ver se o Nav View aparece ou nao
}

private fun configNavView(
    navController: NavController,
    navView: BottomNavigationView

) {
    // pega o id do fragment e compara,se for igual, faz as atribuições necessárias (aparecer ou 
desaparecer Nav View)
    navController.addOnDestinationChangedListener { controller, destination, arguments ->
        if (destination.id == R.id.entrada_graph) {
            navView.visibility = View.GONE

        } else {
            navView.visibility = View.VISIBLE
        }

    }
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {

    val inflater = menuInflater
    inflater.inflate(R.menu.search_menu, menu)

    val manager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    val searchItem = menu?.findItem(R.id.action_search)
    val searchView = searchItem?.actionView as SearchView

    searchView.setSearchableInfo(manager.getSearchableInfo(componentName))

    searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener{
        override fun onQueryTextSubmit(query: String?): Boolean {
            searchView.clearFocus()
            searchView.setQuery("", false)
            searchItem.collapseActionView()

            Toast.makeText(this@MainActivity, "Carregando $query", Toast.LENGTH_LONG).show()
            return true
        }

        override fun onQueryTextChange(newText: String?): Boolean {
            return false
        }

    })
    return true
  }
}

I want to make it appear in only one fragment, I tried to implement the same as my BottomNavigation but I couldn't

2 Answers

KOTLIN

I will show you how to set it up. You need to understand that you can hide the SearchView when inflating your Fragment. Define your SearchView public above onCreate:

val searchItem = menu?.findItem(R.id.action_search)
val searchView = searchItem?.actionView as SearchView

and in your onCreateOptionsMenu you can hide the SearchView with:

searchView.visibility = View.INVISIBLE

or if you want it to be shown:

searchView.visibility = View.VISIBLE

Summary: You need to make public static variables to access everywhere (here your SearchView), then you set in your executing method wether the SearchView is VISIBLE for this Fragment/Activity or not. (inflating part in your class, where the action happen.)

JAVA

I give you a better example for that in JAVA:

Above your onCreate method as told before:

...

public static SearchView searchView; //Defining SearchView

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

and the mentioned executing part in your OnClickListener or OnCreateOptionMenu:

 button_inflating_other_fragment.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ...
            searchView.setVisibility(View.INVISIBLE); //Here example OnClickListener
            ...
                return;
            }

CONCLUSION:

So as you can see you can specify with a few lines of code, wether the SearchView is set or not. I guess you will set that up correctly, Cheers!

If you are in fragment and don't want to show app bar any menu then set

setHasOptionsMenu(false)

And if you need to show any then set in onCreate() method

setHasOptionsMenu(true)

After that you have to hide menu item and show item with this method:

@Override
  public void onPrepareOptionsMenu(Menu menu) {
  super.onPrepareOptionsMenu(menu);
  menu.findItem(R.id.menu_open).setVisible(false);
  menu.findItem(R.id.menu_search).setVisible(true);
}

That's it.

Related