Como posso obter o contexto em um fragmento?
Preciso usar meu banco de dados cujo construtor aceita o contexto, mas, getApplicationContext()
e FragmentClass.this
não funciona, o que posso fazer?
Construtor de banco de dados
public Database(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
getActivity().getApplicationContext()
em uma variável de instância quando o fragmento é criado e, em seguida, usar esse contexto sempre que desejar dentro da classe de fragmento. Esse contexto sobreviverá a desapegos de fragmentos.getActivity
sempre esteve disponível. ÉgetContext
o que foi adicionado em API 23.Para fazer como a resposta acima, você pode substituir o
onAttach
método do fragmento:fonte
DatabaseHelper
necessário um emFragmentActivity
vez de umActivity
? Por exemplo, para umAdapter
...onAttach(Activity activity)
seguida, você deve liberá-lo emonDetach()
onAttach
método foi preterido,Overrides deprecated method in 'android.support.v4.app.Fragment'
Sempre use o método getActivity () para obter o contexto de sua atividade anexada, mas lembre-se sempre de uma coisa: os fragmentos são um pouco instáveis e
getActivity
retornam nulos algumas vezes; portanto, sempre verifique o método isAdded () do fragmento antes de obter o contextogetActivity()
.fonte
A maneira mais fácil e precisa de obter o contexto do fragmento que encontrei é obtê-lo diretamente a partir do
ViewGroup
momento em que você chamar oonCreateView
método, pelo menos aqui, você tem certeza de que não será nulo porgetActivity()
:fonte
Anteriormente eu estou usando
onAttach (Activity activity)
para chegarcontext
emFragment
O
onAttach (Activity activity)
método foi descontinuado no nível 23 da API.Agora, para obter contexto
Fragment
, podemos usaronAttach (Context context)
context
.onCreate(Bundle)
será chamado depois disso.CÓDIGO DE AMOSTRA
NOTA
Também podemos usar
getActivity()
para entrarcontext
,Fragments
masgetActivity()
podemos retornarnull
se o seufragment
não estiver atualmente anexado a um paiactivity
,fonte
fonte
Você também pode obter o contexto do
inflater
parâmetro, ao substituironCreateView
.fonte
Outra abordagem alternativa é:
Você pode obter o contexto usando:
fonte
para obter o contexto dentro do fragmento será possível usando
getActivity()
:Activity
associado ao fragmentogetActivity()
, você pode usá-lo, mas não é recomendável, pois isso causará vazamentos de memória.Eu acho que uma abordagem melhor deve estar recebendo
Activity
oonAttach()
método:fonte
Activity.findViewById
É apenas um método de conveniência para procurar uma visualização na visualização de conteúdo registrado dessa atividade (definidosetContentView
). No exemplo correto, você está chamandoView.findViewById
e nãoActivity.findViewById
está chamando o método na visualização raiz correta . Problema totalmente diferente e, obviamente, você não poderá encontrar sua visão em uma pesquisa que não a sustenta.getContext()
veio na API 23. Substitua-o por getActivity () em todo o código.Veja se ele corrige o erro. Tente usar métodos que estejam entre o nível mínimo e mínimo da API, caso contrário, esse erro ocorrerá.
fonte
Desde nível API 23 não é
getContext()
, mas se você quer apoiar as versões mais antigas que você pode usargetActivity().getApplicationContext()
enquanto eu ainda recomendo usar a versão apoio doFragment
que éandroid.support.v4.app.Fragment
.fonte
getActivity()
é um filho do contexto, de modo que deve funcionar para vocêfonte
Use fragmentos da Biblioteca de suporte -
e depois substituir
Dessa forma, você pode ter certeza de que o contexto sempre será um valor não nulo.
fonte
Você tem opções diferentes:
getActivity()
, pois esse é umContext
.getContext()
.Se você não precisa oferecer suporte a versões antigas, continue com
getContext()
.fonte
Para o Kotlin, você pode usar
context
diretamente em fragmentos. Mas, em alguns casos, você encontrará um erro comopara isso você pode fazer isso
fonte
No kotlin, basta usar em
activity
vez degetActivity()
fonte
Com a API 29+ no Kotlin, eu tive que fazer
Um exemplo seria
fonte
Idealmente, você não precisa usar globals. O fragmento possui notificações diferentes, sendo uma delas onActivityCreated. Você pode obter a instância da atividade neste evento de ciclo de vida do fragmento.
Então: você pode desreferenciar o fragmento para obter a atividade, o contexto ou o contexto da aplicação como desejar:
this.getActivity()
fornecerá o identificador para a atividadethis.getContext()
, fornecerá o identificador para o contextothis.getActivity().getApplicationContext()
, fornecerá o identificador para o contexto do aplicativo. De preferência, você deve usar o contexto do aplicativo ao transmiti-lo para o banco de dados.fonte
A maneira mais simples é usar
getActivity()
. Mas acho que a maior confusão de usar ogetActivity()
método para obter o contexto aqui é uma exceção de ponteiro nulo.Para isso, verifique primeiro com o
isAdded()
método que determinará se ele foi adicionado ou não e, em seguida, podemos usar ogetActivity()
para obter o contexto de Activity.fonte
Você pode ligar
getActivity()
ou,fonte
Você pode usar o método getActivity () para obter contexto ou Você pode usar o método getContext ().
Espero que ajude!
fonte
O método getContext () ajuda a usar o contexto da classe em uma atividade de fragmento.
fonte
Eu acho que você pode usar
fonte
fonte
Também você pode usar:
mas eu preferiria usar
ou
fonte
Eu preciso de contexto para usar o fragmento arrayAdapter IN, quando eu estava usando o erro getActivity, mas quando eu o substituo por getContext, ele funciona para mim
fonte
Você pode usar
getActivity()
ougetContext
no fragmento.Documentação
e
Dica profissional
Verifique sempre,
if(getActivity!=null)
pois pode ser nulo quando o fragmento não está anexado à atividade. Às vezes, fazer uma operação longa no fragmento (como buscar dados da API restante) leva algum tempo. e se o usuário navegar para outro fragmento. Então, getActivity será nulo. E você receberá o NPE se não o tiver tratado.fonte
FragmentHostCallback
classe.Em seu fragmento
Em atividade
fonte
Fragmento interno para amostra kotlin ajudaria alguém
se você usar a ligação de dados;
Onde bindingView é inicializado em onCreateView como este
fonte
O método requireContext () é a opção mais simples
Exemplo
fonte