¿Cómo puedo obtener el contexto en un fragmento?
Tengo que usar mi base de datos cuyo constructor toma en el contexto, pero getApplicationContext()
y FragmentClass.this
no trabajo así que ¿qué puedo hacer?
Constructor de bases de datos
public Database(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
getActivity().getApplicationContext()
en una variable de instancia cuando se crea el fragmento y luego usar ese contexto siempre que lo desee dentro de la clase de fragmento. Ese contexto sobrevivirá a los desprendimientos de fragmentos.getActivity
siempre ha estado disponible. Es elgetContext
que se agregó en la API 23.Para hacer como la respuesta anterior, puede anular el
onAttach
método de fragmento:fuente
DatabaseHelper
necesario un enFragmentActivity
lugar de unActivity
? Por ejemplo, para unAdapter
...onAttach(Activity activity)
, debe publicarla enonDetach()
onAttach
método ha quedado en desuso,Overrides deprecated method in 'android.support.v4.app.Fragment'
Siempre use el método getActivity () para obtener el contexto de su actividad adjunta, pero siempre recuerde una cosa: los fragmentos son ligeramente inestables y
getActivity
devuelven valores nulos algunas veces, así que para eso, siempre verifique el método de fragmento isAdded () antes de obtener el contextogetActivity()
.fuente
La forma más fácil y precisa de obtener el contexto del fragmento que encontré es obtenerlo directamente desde el método
ViewGroup
cuando llamaonCreateView
, al menos aquí está seguro de que no quedará nulo paragetActivity()
:fuente
Anteriormente estoy usando
onAttach (Activity activity)
para obtenercontext
enFragment
El
onAttach (Activity activity)
método quedó en desuso en el nivel 23 de API.Ahora para obtener contexto
Fragment
podemos usaronAttach (Context context)
context
.onCreate(Bundle)
será llamado después de esto.CÓDIGO DE MUESTRA
NOTA
También podemos utilizar
getActivity()
para conseguircontext
enFragments
perogetActivity()
podemos volvernull
si el tufragment
no está conectado actualmente a un padreactivity
,fuente
fuente
También puede obtener el contexto del
inflater
parámetro, al anularloonCreateView
.fuente
Otro enfoque alternativo es:
Puede obtener el contexto usando:
fuente
para obtener el contexto dentro del Fragmento será posible usando
getActivity()
:Activity
asociado con el fragmentogetActivity()
, puede usarlo, pero no se recomienda porque causará pérdidas de memoria.Creo que un mejor enfoque debe ser obtener
Activity
delonAttach()
método:fuente
Activity.findViewById
Es solo un método conveniente para buscar una vista en la vista de contenido registrado de esa actividad (configuradasetContentView
). En su ejemplo correcto, está llamandoView.findViewById
, noActivity.findViewById
, e invocando el método en la vista raíz correcta . Problema totalmente diferente, y obviamente no podrá encontrar su vista en una jerarquía de vistas que no contenga esa vista.getContext()
vino en API 23. Reemplácelo con getActivity () en todas partes del código.Vea si soluciona el error. Intente utilizar métodos que se encuentren entre el objetivo y el nivel mínimo de API; de lo contrario, se producirá este error.
fuente
Desde el nivel 23 de API existe,
getContext()
pero si desea admitir versiones anteriores, puede usarlo,getActivity().getApplicationContext()
pero aún así recomiendo usar la versión de soporteFragment
que esandroid.support.v4.app.Fragment
.fuente
getActivity()
es un niño de contexto, por lo que debería funcionar para ustedfuente
Usar fragmentos de la Biblioteca de soporte :
y luego anular
De esta manera, puede estar seguro de que el contexto siempre será un valor no nulo.
fuente
Tienes diferentes opciones:
getActivity()
, ya que este es unContext
.getContext()
.Si no necesita admitir versiones antiguas, vaya con
getContext()
.fuente
Para Kotlin puede usar
context
directamente en fragmentos. Pero en algunos casos encontrarás un error comopara eso puedes hacer esto
fuente
En kotlin solo use en
activity
lugar degetActivity()
fuente
Con API 29+ en Kotlin, tuve que hacer
Un ejemplo sería
fuente
Idealmente, no debería necesitar usar globals. El fragmento tiene notificaciones diferentes, una de ellas enActivityCreated. Puede obtener la instancia de la actividad en este evento de ciclo de vida del fragmento.
Luego: puede desreferenciar el fragmento para obtener actividad, contexto o contexto de aplicación como desee:
this.getActivity()
le dará el identificador de la actividadthis.getContext()
le dará un identificador del contextothis.getActivity().getApplicationContext()
le dará el identificador del contexto de la aplicación. Preferiblemente debe usar el contexto de la aplicación al pasarlo a la base de datos.fuente
La forma simple es usar
getActivity()
. Pero creo que la mayor confusión de usar elgetActivity()
método para obtener el contexto aquí es una excepción de puntero nulo.Para esto, primero verifique con el
isAdded()
método que determinará si se agrega o no, y luego podemos usar elgetActivity()
para obtener el contexto de Actividad.fuente
Puedes llamar
getActivity()
o,fuente
Puede usar el método getActivity () para obtener contexto o puede usar el método getContext ().
¡Espero que ayude!
fuente
El método getContext () ayuda a usar el contexto de la clase en una actividad de fragmento.
fuente
Creo que puedes usar
fuente
fuente
También puedes usar:
pero preferiría usar
o
fuente
Necesito contexto para usar el fragmento de arrayAdapter IN, cuando estaba usando el error getActivity ocurre pero cuando lo reemplazo con getContext funciona para mí
fuente
Puedes usar
getActivity()
ogetContext
en Fragment.Documentación
y
Consejo profesional
Compruebe siempre
if(getActivity!=null)
porque puede ser nulo cuando el fragmento no está asociado a la actividad. A veces, realizar operaciones largas en fragmentos (como recuperar datos de la API de descanso) lleva algún tiempo. y si el usuario navega a otro fragmento. Entonces getActivity será nulo. Y obtendrá NPE si no lo manejó.fuente
FragmentHostCallback
clase.En tu fragmento
En la actividad
fuente
El fragmento interior para la muestra de Kotlin ayudaría a alguien
si usa enlace de datos;
Donde vinculanteView se inicializa en onCreateView como este
fuente
El método requireContext () es la opción más simple
Ejemplo
fuente