Atualizei meu aplicativo para usar a biblioteca de suporte mais recente (versão 23.0.0). Descobri que eles preteriram a função onAttach () da classe Fragment.
Ao invés de:
onAttach (Activity activity)
É neve:
onAttach (Context context)
Como meu aplicativo usa a atividade passada antes da depreciação, acho que uma possível solução é:
@Override
public void onAttach(Context context) {
super.onAttach(context);
activity = getActivity();
}
Essa seria a maneira correta de fazer isso?
ATUALIZAR:
Se eu executar um dispositivo com API menor que 23, o novo onAttach () nem será chamado. Espero que não seja isso que eles pretendam fazer!
ATUALIZAÇÃO 2:
O problema foi resolvido com as atualizações mais recentes do SDK.
Eu testei no meu dispositivo API 22 e onAttach (Context) está sendo chamado.
Clique aqui para seguir o relatório de erros que abri há algumas semanas e as respostas dos funcionários do Google.
android
android-fragments
TareK Khoury
fonte
fonte
Context
? Você não precisa de umActivity
para anexar e exibir um fragmento de qualquer maneira? De que outra forma você usará oContext
parâmetro?onAttach(Context context)
seja chamado, você precisa usar um dispositivo que tenha pelo menos API 23 OU usar android.support.v4.app.Fragment. Veja aquiRespostas:
Atividade é um contexto, portanto, se você pode simplesmente verificar se o contexto é uma Atividade e transmiti-lo, se necessário.
Atualização: alguns estão alegando que a nova
Context
substituição nunca é chamada. Eu fiz alguns testes e não consigo encontrar um cenário em que isso seja verdade e, de acordo com o código-fonte, nunca deve ser verdade. Em todos os casos que testei, antes e depois do SDK23,Activity
asContext
versões e asonAttach
foram chamadas. Se você puder encontrar um cenário em que esse não seja o caso, sugiro que você crie um projeto de exemplo ilustrando o problema e relate à equipe do Android .Atualização 2: só uso os fragmentos da Biblioteca de Suporte Android, pois os bugs são corrigidos mais rapidamente lá. Parece que o problema acima, em que as substituições não são chamadas corretamente, só vem à tona se você usar os fragmentos da estrutura.
fonte
onAttach(Context)
nem parecem ser chamados.onAttach(context)
não ser chamado.Esta é outra grande mudança do Google ... A modificação sugerida: substituir
onAttach(Activity activity)
poronAttach(Context context)
travar meus aplicativos em APIs mais antigas, poisonAttach(Context context)
não será chamada em fragmentos nativos.Eu estou usando os fragmentos nativos (android.app.Fragment), então tive que fazer o seguinte para fazê-lo funcionar novamente em APIs mais antigas (<23).
Aqui está o que eu fiz:
fonte
Se você usar os fragmentos da estrutura e a versão do SDK do dispositivo for menor que 23,
OnAttach(Context context)
não será chamado.Eu uso fragmentos de suporte, então a depreciação é corrigida e
onAttach(Context context)
sempre é chamada.fonte
Atualmente, a partir do
onAttach
código do fragmento, não está claro se essaContext
é a atividade atual: código-fonteSe você der uma olhada
getActivity
, verá a mesma chamadaPortanto, se você quiser ter certeza de que está recebendo a Atividade, use
getActivity()
(onAttach
no seuFragment
), mas não se esqueça de verificarnull
porque, semHost
for,null
sua atividade seránull
fonte
fonte
Embora pareça que na maioria dos casos é suficiente
onAttach(Context)
, existem alguns telefones (por exemplo: Xiaomi Redme Note 2) onde não está sendo chamado, portanto, causa NullPointerExceptions. Portanto, para garantir a segurança, sugiro deixar o método obsoleto também:fonte
Baixe a mais nova biblioteca de suporte com o gerenciador sdk e inclua
no gradle.app e defina a versão de compilação como api 23
fonte
A resposta abaixo está relacionada a este aviso de descontinuação que ocorre no tutorial Fragmentos no site do desenvolvedor do Android e pode não estar relacionado às postagens acima.
Eu usei esse código na lição do tutorial e funcionou.
Eu estava preocupado que a atividade talvez fosse nula como afirma a documentação.
getActivity
FragmentActivity getActivity () Retorne a FragmentActivity à qual este fragmento está associado atualmente. Pode retornar nulo se o fragmento estiver associado a um contexto.
Mas o onCreate no main_activity mostra claramente que o fragmento foi carregado e, após esse método, chamar a atividade get do fragmento retornará a classe main_activity.
getSupportFragmentManager (). beginTransaction () .add (R.id.fragment_container, firstFragment) .commit ();
Espero estar certo com isso. Eu sou um novato absoluto.
fonte
você provavelmente está usando
android.support.v4.app.Fragment
. Para isso, em vez deonAttach
método, basta usargetActivity()
para obter aFragmentActivity
que o fragmento está associado. Caso contrário, você poderia usar oonAttach(Context context)
métodofonte
Isso funcionou para mim quando eu defini a Interface 'TopSectionListener', seu objeto command de atividade:
fonte