Skocz do zawartości
Majks

Dostęp do toolbara [Android navigation component]

    Rekomendowane odpowiedzi

    Majks
    Napisano (edytowane)

    Hej, mam toolbar z moim fragmencie gdzie hostuje inne fragmenty. Na przykladzie filmiku mam go w activity_main. Chcę zmienić tytuł toolbara we fragmencie Home i próbuję:

    binding.root.homeToolbar.title = "tytul" 

    ale wywala błąd że homeToolbar must not be null

    dodana zawartość

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/homeToolbar"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:theme="?attr/actionBarTheme"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:title="@string/title"
        app:titleTextColor="@color/textColorWhite" />
    Edytowane przez Majks

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    mmaciejow
    Napisano (edytowane)

    Jeżeli używasz navigation component to on automatycznie zmienia nazwę toolbara.

    toolbar.setupWithNavController(navController)

    toolbar.setupWithNavController(navController)

    https://developer.android.com/guide/navigation/navigation-ui#top_app_bar

    https://myenv.net/blog/android-architecture-components-navigation/

    Edytowane przez mmaciejow

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Majks

    Miałeś na myśli, że zmienia na label który mamy zdefiniowany w pliku z nawigacją?

    <fragment
        android:id="@+id/homeFragment"
        android:name="com.example.HomeFragment"
        android:label="Home"
        tools:layout="@layout/fragment_home" >

    Jeśli tak to mam to obsłużone robie to tak:

    navHostFragment?.navController?.addOnDestinationChangedListener { _, destination, _ ->
        binding.homeToolbar.title = getString(R.string.app_name) + " " + destination.label!!
    }

    Jeszcze raz wytłumaczę o co mi chodzi. W jednym fragmencie wybieram item z listy i przechodzę do drugiego fragmentu. W drugim fragmencie W toolbarze chcę wyświetlić nazwę tego itemu. Nazwę  mam już przesłaną za pomocą bundle'a.  Chcę teraz tylko wyswietlić tę nazwę

    dodana zawartość

    
    
    class MainFragment : Fragment() {
    
        private lateinit var binding: FragmentMainBinding
    
        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            // Inflate the layout for this fragment
            binding = FragmentMainBinding.inflate(inflater)
    
            val navHostFragment = childFragmentManager.findFragmentById(R.id.fragmentHost) as NavHostFragment?
    
            navHostFragment?.navController?.addOnDestinationChangedListener { _, destination, _ ->
                when(destination.id) {
                     R.id.chatFragment,
                        -> {
                                binding.bottomNavigationView.visibility = View.GONE
                                binding.homeToolbar.visibility = View.GONE
                        }
    
                    else
                        -> {
                            binding.bottomNavigationView.visibility = View.VISIBLE
                            binding.homeToolbar.visibility = View.VISIBLE
                        }
                }
            }
    
            if (navHostFragment != null) {
                NavigationUI.setupWithNavController(
                    binding.bottomNavigationView,
                    navHostFragment.navController
                )
            }
    
           navHostFragment?.navController?.addOnDestinationChangedListener { _, destination, _ ->
               binding.homeToolbar.title = getString(R.string.app_name) + " " + destination.label!!
           }
    
    
    
            return binding.root
        }
    
        /**
         * Sets bottomNavView as NavController
         */
        private fun setNavController(){
            val navController = Navigation.findNavController(requireActivity(),
                R.id.fragmentHost)
            bottomNavigationView.setupWithNavController(navController)
            homeToolbar.setupWithNavController(navController)
    
        }
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
            setNavController()
        }
    
    }

    Tak wygląda klasa fragmentu, który hostuje inne.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    mmaciejow

    @Majks jezeli chesz przejść z MainFragment do SettingsFragment to w mainfragment dajesz coś takiego:

    override fun onCreateView(
                inflater: LayoutInflater,
                container: ViewGroup?,
                savedInstanceState: Bundle?
        ): View? {
            val root = inflater.inflate(R.layout.fragment_main, container, false)
            val button: Button = root.findViewById(R.id.button)
    
            button.setOnClickListener{
                root.findNavController().navigate(R.id.nav_settings)
            }
    
    
            return root
        }

    w pliku xml z nawigacją umieszczasz dwa fragmenty:

    <fragment
        android:id="@+id/MainFragment"
        android:name="MainFragment"
        android:label="Main"
        tools:layout="@layout/fragment_main" />
    
    <fragment
        android:id="@+id/SettingsFragment"
        android:name="SettingsFragment"
        android:label="Settings"
        tools:layout="@layout/fragment_settings" />

    Wtedy toolbar automatycznie zmieni swoją nazwę. Wcześniej w aktywności dodaj tą linijkę, która podałem wyżej.

    Można też również to zrobić na akcjach. Poczytaj te dwa linki.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Majks

    @mmaciejow Hmm myslę, że się nadal nie rozumiemy :):) Nagrałem filmik. Wyświetlanie label'ów mam ogarnięte. Ale w jednym fragmencie nie chę wyświetlić label'a tylko zmienną. Na nagraniu ucieło caly tekst ale jest nam napisane "Tutaj chcę wyswietlić nazwę wybranego itemu". Bo w tym chat fragmencie mam recyclerView z listą pobieraną z bazy danych.

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    mmaciejow
    Napisano (edytowane)

    @Majks jeżeli chcesz ręcznie ustawić tytuł toolbara to we fragmencie możesz zrobić na kilka sposobów.

    1. W metodzie onCreateView() lub onResume()

    (activity as YourActivity).supportActionBar?.title = "Custom title Toolbar"

    2. Tworzysz interfejs typu listener. 

    3. W aktywności, nadsłuchujesz na nawigację i odpowiednio reagujesz. 

    4. Przekazanie jako argumentu. Patrz argumenty w komponencie nawigacji.

    Edytowane przez mmaciejow

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    Majks

    @mmaciejow

    Dzięki to jest to o co mi chodziło :)

    (activity as BasicActivity).homeToolbar.title = "${selectedItem.name}"

    Mam jeszcze jedno pytanie, jak mogę zmienic widok tego toolbaru? Stworzyłem nowy plik xml i napisałem toolbar

    <?xml version="1.0" encoding="utf-8"?>
    
    <androidx.appcompat.widget.Toolbar
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/homeToolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:minHeight="?attr/actionBarSize"
        android:maxHeight="?attr/actionBarSize"
        android:theme="?attr/actionBarTheme"
        app:title="@string/title"
        app:titleTextColor="@color/textColorWhite">
    
        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <ImageView
                android:id="@+id/itemImageView"
                android:layout_width="?attr/actionBarSize"
                android:layout_height="match_parent"
                android:background="@drawable/ic_chat"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintStart_toStartOf="parent"/>
    
        </androidx.constraintlayout.widget.ConstraintLayout>
    
    </androidx.appcompat.widget.Toolbar>
    

    Kombinuje, żeby ustawić ten widok ale coś nie wychodzi. Gdy próbuję tak:

    binding.homeToolbar.setBackgroundResource(resources.getLayout(R.layout.toolbar_chat_view))

    Wywala, że oczekiwano Int'a a nie XmlResourceParse.

    binding.homeToolbar.background = layoutInflater.inflate(R.layout.toolbar_chat_view, null)

    Wywala, że oczekiwano Drawable a nie View.

    I tak próbuję z wykorzystaniem jeszcze

    val view: View? = inflater.inflate(R.layout.toolbar_chat_view, null)

    ale nie daję rady.

     

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach
    mmaciejow

    Troche o tym pisałem tutaj:

    https://myenv.net/blog/android-toolbar/

    ewentualnie skorzystaj z:

    getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
    getSupportActionBar().setCustomView(R.layout.custom_toolbar);    

    I nie kombinuj z tym data binding. On służy do czegoś innego.  

    PS: Jeżeli chcesz kogoś zawołać, to kilknij w nick, nie musisz pisac z palca. Chodzi mi o @...

    • Piwko! 1

    Udostępnij tę odpowiedź


    Odnośnik do odpowiedzi
    Udostępnij na innych stronach

    Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

    Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

    Zarejestruj nowe konto

    Załóż nowe konto. To bardzo proste!

    Zarejestruj się

    Zaloguj się

    Posiadasz już konto? Zaloguj się poniżej.

    Zaloguj się

    • Ostatnio przeglądający   0 użytkowników

      Brak zarejestrowanych użytkowników przeglądających tę stronę.

    x