Estou iniciando um novo projeto que usa a biblioteca de suporte AppCompat/ActionBarCompat
in v7
. Estou tentando descobrir como usar o getSupportActionBar
de dentro de um fragmento. Minha atividade que hospeda o fragmento se estende ActionBarActivity
, mas não vejo uma classe de suporte semelhante para fragmentos.
De dentro do meu fragmento
public class CrimeFragment extends Fragment {
//...
getActivity().getSupportActionBar().setSubtitle(R.string.subtitle); // getSupportActionBar is not defined in the v4 version of Fragment
//...
}
A página do google para usá-lo ( http://android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html ) diz que não deve haver alterações para o v4
fragmento. Eu preciso transmitir todas as minhas getActivity()
chamadas para um ActionBarActivity
? Isso parece um design ruim.
Embora esta questão já tenha uma resposta aceita, devo ressaltar que não é totalmente correta: ligar
getSupportActionBar()
deFragment.onAttach()
causará umNullPointerException
quando a atividade for rotacionada.Resposta curta:
Use
((ActionBarActivity)getActivity()).getSupportActionBar()
emonActivityCreated()
(ou qualquer ponto posterior em seu ciclo de vida) em vez deonAttach()
.Resposta longa:
O motivo é que, se um
ActionBarActivity
for recriado após uma rotação, ele restaurará todos os fragmentos antes de realmente criar oActionBar
objeto.Código-fonte para
ActionBarActivity
nasupport-v7
biblioteca:ActionBarActivityDelegate.createDelegate()
cria omImpl
objeto dependendo da versão do Android.super.onCreate()
éFragmentActivity.onCreate()
, que restaura quaisquer fragmentos anteriores após uma rotação (FragmentManagerImpl.dispatchCreate()
, & c).mImpl.onCreate(savedInstanceState)
éActionBarActivityDelegate.onCreate()
, que lê amHasActionBar
variável do estilo da janela.mHasActionBar
seja verdade,getSupportActionBar()
sempre vai voltarnull
.Fonte para
ActionBarActivityDelegate.getSupportActionBar()
:fonte
ActionBarActivity
está obsoleto. Use emAppCompatActivity
vez dissoSe alguém usar com.android.support:appcompat-v7: e AppCompatActivity como atividade, isso funcionará
fonte
em sua tag
fragment.xml
adicionarToolbar
da biblioteca de suporteAgora, como podemos controlar isso da
MyFragment
aula? vamos verdentro da
onCreateView
função adicione o seguintee se você deseja adicionar
items
à barra de ferramentas dentro deMyFragment
vocêmust
adicione dentro linha deonCreateView
funçãoesta linha é importante, se você esquecê-la, o android não irá preencher os itens do menu.
suponha que os identificamos em
menu/fragment_menu.xml
depois disso, substitua as seguintes funções
espero que isto ajude
fonte
Como uma resposta atualizada para a resposta de Pierre-Antoine LaFayette
ActionBarActivity está obsoleto; use ao
AppCompatActivity
invésfonte
Para aqueles que usam kotlin,
fonte