Добавить панель инструментов Android во фрагмент без панели действий (значки не отображаются)

#java #android #kotlin

#java #Android #kotlin

Вопрос:

Я хочу добавить значок уведомления слева и значок поиска справа от панели инструментов.

Я подхожу следующим образом, но не работает

Я хочу добиться чего-то подобного

Я хочу сделать что-то вроде этого

Мой код:

fragment_browse.xml

  <androidx.appcompat.widget.Toolbar
            android:id="@ id/tb_toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:background="?attr/colorAccent"
            android:minHeight="?attr/actionBarSize"
            app:actionViewClass="android.support.v7.widget.SearchView"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:theme="@style/ThemeOverlay.AppCompat.Dark"
            app:title="Browse" />
  

Внутри BrowseFragment.kt

 override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    inflater.inflate(R.menu.browse_menu, menu)
    val searchItem = menu.findItem(R.id.appSearchBar)
    val searchManager = activity?.getSystemService(Context.SEARCH_SERVICE) as SearchManager

    if (searchItem != null) {
        searchView = searchItem.actionView as SearchView
    }

    if (searchView != null) {
        searchView!!.setSearchableInfo(searchManager.getSearchableInfo(activity!!.componentName))
        queryTextListener = object : SearchView.OnQueryTextListener {
            override fun onQueryTextChange(newText: String): Boolean {
                Log.i("onQueryTextChange", newText)
                return true
            }

            override fun onQueryTextSubmit(query: String): Boolean {
                Log.i("onQueryTextSubmit", query)
                return true
            }
        }
        searchView!!.setOnQueryTextListener(queryTextListener)
    }
    super.onCreateOptionsMenu(menu, inflater)
}
  

Мой метод onCreateView

  override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {
    val view = inflater.inflate(R.layout.fragment_browse, container, false)
    var toolbar = view.findViewById(R.id.tb_toolbar) as Toolbar
    (activity as AppCompatActivity?)!!.setSupportActionBar(toolbar)
    

return view
}
  

Комментарии:

1. Вам действительно нужна панель инструментов в формате xml? Вы можете изменить панель инструментов с помощью других макетов, таких как RelativeLayout, и добавить свои представления в этот макет, а затем закрепить в верхней части макета фрагмента.

2. да, я могу это сделать

Ответ №1:

На мой взгляд, вы могли бы просто раздуть меню для существующей панели инструментов (вместо setSupportActionBar). Вот пример:

         toolbar.inflateMenu(R.menu.browse_menu)
        //this inflates your menu programmatically
        val searchItem = toolbar.menu.findItem(R.id.appSearchBar)
        //do your code with menuitem here

        toolBar.setNavigationIcon(androidx.appcompat.R.drawable.abc_ic_ab_back_material)
        //or put there your icon ID - that's for the icon at the left side
        toolBar.setNavigationOnClickListener { view ->
        //that's the click handler for the icon at the left side
        }
  

И вам не нужно переопределять onCreateOptionsMenu и никаких действий таким образом.