Estoy empezando un nuevo proyecto que utiliza el AppCompat/ActionBarCompat
de v7
biblioteca de soporte. Estoy tratando de averiguar cómo usar el getSupportActionBar
desde dentro de un fragmento. Mi actividad que aloja el fragmento se extiende ActionBarActivity
, pero no veo una clase de soporte similar para Fragmentos.
Desde dentro de mi fragmento
public class CrimeFragment extends Fragment {
//...
getActivity().getSupportActionBar().setSubtitle(R.string.subtitle); // getSupportActionBar is not defined in the v4 version of Fragment
//...
}
La página de Google para usarlo ( http://android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html ) dice que no debería haber cambios para el v4
fragmento. ¿Necesito enviar todas mis getActivity()
llamadas a un ActionBarActivity
? Eso parece un mal diseño.
Si bien esta pregunta ya tiene una respuesta aceptada, debo señalar que no es del todo correcta: llamar
getSupportActionBar()
desdeFragment.onAttach()
causará unNullPointerException
cuando se rota la actividad.Respuesta corta:
Úselo
((ActionBarActivity)getActivity()).getSupportActionBar()
enonActivityCreated()
(o en cualquier punto posterior de su ciclo de vida) en lugar deonAttach()
.Respuesta larga:
La razón es que si
ActionBarActivity
se recrea después de una rotación, restaurará todos los Fragmentos antes de crear realmente elActionBar
objeto.Código fuente para
ActionBarActivity
en lasupport-v7
biblioteca:ActionBarActivityDelegate.createDelegate()
crea elmImpl
objeto según la versión de Android.super.onCreate()
esFragmentActivity.onCreate()
, que restaura los fragmentos anteriores después de una rotación (FragmentManagerImpl.dispatchCreate()
, & c).mImpl.onCreate(savedInstanceState)
esActionBarActivityDelegate.onCreate()
, que lee lamHasActionBar
variable del estilo de la ventana.mHasActionBar
es verdad,getSupportActionBar()
siempre volveránull
.Fuente de
ActionBarActivityDelegate.getSupportActionBar()
:fuente
ActionBarActivity
es obsoleto. Úselo en suAppCompatActivity
lugarSi alguien usa com.android.support:appcompat-v7: y AppCompatActivity como actividad, esto funcionará
fuente
en su
fragment.xml
complementoToolbar
etiqueta de la biblioteca de soporteAhora bien, ¿cómo podemos controlarlo desde
MyFragment
clase? veamosdentro de la
onCreateView
función agregue lo siguientey si desea agregar
items
a la barra de herramientas dentro deMyFragment
usted,must
agregue esta línea dentro de laonCreateView
funciónEsta línea es importante, si la olvida, Android no completará los elementos de su menú.
asumimos que los identificamos en
menu/fragment_menu.xml
después de eso, anula las siguientes funciones
espero que esto ayude
fuente
Como respuesta actualizada a la respuesta de Pierre-Antoine LaFayette
ActionBarActivity está en desuso; usar
AppCompatActivity
en su lugarfuente
Para aquellos que usan kotlin,
fuente