¿Cómo obtener la barra de herramientas del fragmento?

107

Tengo ActionBarActivitycon NavigationDrawery uso support_v7 Toolbarcomo ActionBar. En uno de mis fragmentos, la barra de herramientas tiene una vista personalizada. En otros fragmentos Toolbardebe mostrar título.

¿Cómo obtener una Toolbarinstancia para personalizar a partir de fragmentos? Puedo obtener ActionBar con getActivity().getActionBar(), pero si llamo setTitle()para esta instancia ActionBar, no hace nada.

UPD:

En mi caso

((ActionBarActivity) getActivity()).getSupportActionBar().setTitle();

(como dijo MrEngineer13) no funciona en la creación del primer fragmento porque lo llamo desde onHiddenChanged (). Ahora agrego más uno a onCreateView () y funciona bien.

anisart
fuente
los fragmentos no tienen barras de acción / barras de herramientas, las actividades sí
tyczj
(MainAcivity) this.getActivity ()). GetToolbar (); será la respuesta correcta !! por obtener la barra de herramientas en fragmentos !!
LOG_TAG

Respuestas:

201

Debes enviar tu actividad de getActivity()a AppCompatActivityprimero. He aquí un ejemplo:

((AppCompatActivity) getActivity()).getSupportActionBar().setTitle();

La razón por la que tienes que lanzarlo es porque getActivity()devuelve un FragmentActivityy necesitas unAppCompatActivity

En Kotlin:

(activity as AppCompatActivity).supportActionBar?.title = "My Title"
MrEngineer13
fuente
8
obtener 'supportActionBar' y 'toolbar' es lo mismo?
Darpan
@Darpan no está seguro
Konstantin Konopko
Si agrego esto, cambia el título. Pero si vuelvo a la actividad principal, ¿cómo puedo cambiar el título nuevamente? Quiero decir, tengo un cajón de navegación. El cajón lateral tiene algunos fragmentos y la actividad principal tiene su propio título. Cuando establezco el título de la actividad principal, funciona y en fragmentos, la forma en que mencionaste funcionó perfectamente. Pero, ¿cómo debo cambiar el título de la actividad al regresar?
Kylo Ren
82

En caso de que los fragmentos tengan una vista personalizada de ToolBar, puede implementar ToolBar para cada fragmento por separado.

agregue ToolBar en fragment_layout:

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimaryDark"/>

encuéntrelo en fragmento:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment, container, false);
        Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);

        //set toolbar appearance
        toolbar.setBackground(R.color.material_blue_grey_800);

        //for crate home button
        AppCompatActivity activity = (AppCompatActivity) getActivity();
        activity.setSupportActionBar(toolbar);
        activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

El oyente de menú se puede crear de dos maneras: anular onOptionsItemSelected en su fragmento:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
        case android.R.id.home:
            getActivity().onBackPressed();
    }
    return super.onOptionsItemSelected(item);
}

o configure el oyente para la barra de herramientas cuando la cree en onCreateView ():

toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                return false;
            }
        });
Flinbor
fuente
1
Solo quiero confirmar que esto es la forma correcta de hacerlo. Si cargamos un fragmento diferente con la barra de herramientas en viewpager + Tablayout o Pagertabstripe, ¿afectará el rendimiento de la aplicación al deslizar el dedo?
LOG_TAG
1
@LOG_TAG Tengo un diseño de cajón con cada fragmento que implementa la barra de herramientas (y por lo tanto tiene una barra de herramientas en su archivo de diseño) y el código anterior funcionó muy bien para mí.
MattBoothDev
¡Gracias! Trabajó como HEYUL !! :) Por cierto, es mejor anular la actividad principal en onOptionsItemSelected()lugar de la de Fragmentos, para evitar la repetición del código.
Aditya Naique
@ChadMx no, por qué incluso escribió sobre cómo agregar una barra de herramientas en xml, etc. El autor preguntó cómo obtener la barra de herramientas mediante programación desde el fragmento. Entonces, stackoverflow.com/a/26998718/4548520 esta es la mejor / correcta respuesta y es corta
user25
43

Tiene dos opciones para obtener la barra de herramientas en fragmentos

El primero

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);

y el segundo

Toolbar toolbar = ((MainActivity) getActivity()).mToolbar;
Bhargav Thanki
fuente
Pero, ¿es esta la forma correcta ... porque también tenemos getSupportedActionBar?
Code_Life
9
toolbar = (Toolbar) getView().findViewById(R.id.toolbar);
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);
Danial
fuente
2

Para usuarios de Kotlin (activity as AppCompatActivity).supportActionBar?.show()

Muhamed Riyas M
fuente
!!es completamente evitable con ?y le evitará un posible accidente
JonZarate
Creo que esto es mejor(activity as? AppCompatActivity)?.supportActionBar?.show()
JonZarate
1

Quizás tengas que intentarlo getActivity().getSupportActionBar().setTitle()si estás usando support_v7.

Wang
fuente
1

Desde su Fragmento: (¿Obtener la barra de herramientas del fragmento?)

// get toolbar
((MainAcivity)this.getActivity()).getToolbar();  // getToolbar will be method in Activity that returns Toolbar!!  don't use getSupportActionBar for getting toolbar!!
// get action bar
this.getActivity().getSupportActionBar();

¡Esto es muy útil cuando está usando la ruleta en la barra de herramientas y llama la ruleta o las vistas personalizadas en la barra de herramientas desde un fragmento!

De tu actividad:

// get toolbar
this.getToolbar();
// get Action Bar
this.getSupportActionBar();
LOG_TAG
fuente
3
Tienes que tener un método en tu actividad llamado getToolbar () , lo cual es malo, porque no es así como se debe hacer la comunicación entre la actividad y el fragmento.
Marko
2
sí, no hay otra manera de hacerlo !! muchas de las librerías del cajón de navegación implementan este estilo solamente. algunas veces necesitamos lanzar la actividad debido a AppCompatActivity (AppCompatActivity) getActivity () que es otro punto de dolor. todo esto mata totalmente el tiempo de desarrollo :(
LOG_TAG
1

En XML

 <androidx.appcompat.widget.Toolbar
  android:id="@+id/main_toolbar"
  android:layout_width="match_parent"
  android:layout_height="?attr/actionBarSize"
  app:layout_scrollFlags="scroll|enterAlways">
 </androidx.appcompat.widget.Toolbar>

Kotlin: en fragment.kt -> onCreateView ()

setHasOptionsMenu(true)

val toolbar = view.findViewById<Toolbar>(R.id.main_toolbar)

(activity as? AppCompatActivity)?.setSupportActionBar(toolbar)

(activity as? AppCompatActivity)?.supportActionBar?.show()

-> onCreateOptionsMenu ()

   override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
       inflater.inflate(R.menu.app_main_menu,menu)
       super.onCreateOptionsMenu(menu, inflater)
   }

-> onOptionsItemSelected ()

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
             R.id.selected_id->{//to_do}
             else -> super.onOptionsItemSelected(item)
        }
    }
Priom Khan
fuente
0

Lo hice siguiendo estos pasos.

  1. Establezca el título usando el siguiente código en onCreateViewel fragmento principal.
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your title");
  1. Para intercambiar entre fragmentos, estoy usando la barra de navegación inferior que se implementa en MainActivity(Actividad principal) del fragmento. Incluso si está utilizando cualquier botón o elemento del menú, puede cambiar el título de onSelectedItemClickListener, tal como lo hice en mi caso.
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
        switch (menuItem.getItemId()){
            case R.id.menu_dashboard:
                getSupportActionBar().setTitle("Dashboard");
                fm.beginTransaction().hide(active).show(dashboardFragment).commit();
                active = dashboardFragment;
                return true;
            case R.id.menu_workshop:
                getSupportActionBar().setTitle("Workshops");
                fm.beginTransaction().hide(active).show(workshopFragment).commit();
                active = workshopFragment;
                return true;
         }
         return false;
    }
Deepak Kaushik
fuente
0

Si está utilizando una barra de herramientas personalizada o ActionBar y desea obtener una referencia de su barra de herramientas / barra de acción de Fragments, primero debe obtener una instancia de su Actividad principal del Método onCreateView de Fragment como se muestra a continuación.

MainActivity activity = (MainActivity) getActivity();

luego use la actividad para una mayor implementación como a continuación

ImageView vRightBtn = activity.toolbar.findViewById(R.id.toolbar_right_btn);

Antes de llamar a esto, debe inicializar su barra de herramientas personalizada en su MainActivity como se muestra a continuación.

Primero defina su barra de herramientas pública como

public Toolbar toolbar;
public ActionBar actionBar;

y en el método onCreate () asigne la identificación de la barra de herramientas personalizada

toolbar = findViewById(R.id.custom_toolbar);
setSupportActionBar(toolbar);
actionBar = getSupportActionBar();

Eso es. Funcionará en Fragmento.

mdubey
fuente