【问题标题】:make the search function on the app bar disappear使应用栏上的搜索功能消失
【发布时间】:2021-07-08 20:11:36
【问题描述】:

我有一个包含搜索的应用栏,我想让它只出现在片段中,而不是像现在这样出现。我将如何改变他的知名度?

主要活动在哪里实现

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

我想让它只出现在一个片段中,我尝试实现与我的 BottomNavigation 相同但我做不到

【问题讨论】:

    标签: android kotlin search


    【解决方案1】:

    科特林

    我将向您展示如何设置它。 您需要了解,在为Fragment 充气时可以隐藏SearchView。 在onCreate 上方定义您的SearchView public:

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

    在您的onCreateOptionsMenu 中,您可以使用以下命令隐藏SearchView

    searchView.visibility = View.INVISIBLE
    

    或者如果你想显示它:

    searchView.visibility = View.VISIBLE
    

    总结: 您需要使public static 变量可以在任何地方访问(这里是您的SearchView),然后在您的执行方法中设置SearchView 是否是VISIBLE 对于这个Fragment/Activity 或不是。 (在你的课堂上膨胀部分,动作发生的地方。)

    JAVA

    我在JAVA给你一个更好的例子:

    如前所述,在您的 onCreate 方法之上:

    ...
    
    public static SearchView searchView; //Defining SearchView
    
    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    

    以及您的OnClickListenerOnCreateOptionMenu 中提到的执行部分:

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

    结论:

    如您所见,您可以用几行代码指定SearchView 是否为set。我猜你会正确设置,干杯!

    【讨论】:

      【解决方案2】:

      如果您在片段中并且不想显示应用栏任何菜单,请设置

      setHasOptionsMenu(false)
      

      如果您需要显示任何内容,请在 onCreate() 方法中设置

      setHasOptionsMenu(true)
      

      之后,您必须使用此方法隐藏菜单项并显示项:

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

      就是这样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多