java - studio - kotlin fragment get context
Usando contexto en un fragmento (24)
¿Cómo puedo obtener el contexto en un fragmento?
Necesito usar mi base de datos cuyo constructor toma en el contexto, pero getApplicationContext()
y FragmentClass.this
getApplicationContext()
no funciona, ¿qué puedo hacer?
Constructor de base de datos
public Database(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
Puedes usar getActivity()
o getContext
en Fragmento.
Documentación
/**
* Return the {@link FragmentActivity} this fragment is currently associated with.
* May return {@code null} if the fragment is associated with a {@link Context}
* instead.
*
* @see #requireActivity()
*/
@Nullable
final public FragmentActivity getActivity() {
return mHost == null ? null : (FragmentActivity) mHost.getActivity();
}
y
/**
* Return the {@link Context} this fragment is currently associated with.
*
* @see #requireContext()
*/
@Nullable
public Context getContext() {
return mHost == null ? null : mHost.getContext();
}
Consejo profesional
Compruebe siempre if(getActivity!=null)
porque puede ser nulo cuando el fragmento no está adjunto a la actividad. A veces, realizar una operación prolongada en un fragmento (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ás NPE si no lo manejas.
Anteriormente, estoy usando onAttach (Activity activity)
para obtener el context
en Fragment
Problema
El onAttach (Activity activity)
quedó en desuso en el nivel 23 de API.
Solución
Ahora para obtener el contexto en Fragment
podemos usar onAttach (Context context)
onAttach (Context context)
- Se llama cuando un fragmento se adjunta por primera vez a su
context
.onCreate(Bundle)
será llamado después de esto.
Documentación
/**
* Called when a fragment is first attached to its context.
* {@link #onCreate(Bundle)} will be called after this.
*/
@CallSuper
public void onAttach(Context context) {
mCalled = true;
final Activity hostActivity = mHost == null ? null : mHost.getActivity();
if (hostActivity != null) {
mCalled = false;
onAttach(hostActivity);
}
}
CÓDIGO DE MUESTRA
public class FirstFragment extends Fragment {
private Context mContext;
public FirstFragment() {
// Required empty public constructor
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
mContext=context;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rooView=inflater.inflate(R.layout.fragment_first, container, false);
Toast.makeText(mContext, "THIS IS SAMPLE TOAST", Toast.LENGTH_SHORT).show();
// Inflate the layout for this fragment
return rooView;
}
}
NOTA
También podemos usar getActivity()
para obtener el context
en los Fragments
pero getActivity()
puede devolver un null
si su fragment
no está adjunto a una activity
principal,
Creo que puedes usar
public static class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Context context = getActivity.getContext();
}
}
Desde el nivel de API 23, hay getContext()
pero si quieres admitir versiones anteriores, puedes usar getActivity().getApplicationContext()
mientras sigo recomendando usar la versión de soporte de Fragment
que es android.support.v4.app.Fragment
.
Idealmente, no deberías necesitar usar globales. El fragmento tiene diferentes notificaciones, una de ellas está en ActivityCreated. Puede obtener la instancia de la actividad en este evento del ciclo de vida del fragmento.
Luego: puede desreferenciar el fragmento para obtener la actividad, el contexto o el contexto de la aplicación como desee:
this.getActivity()
te dará el identificador de la actividad this.getContext()
te dará un identificador del contexto this.getActivity().getApplicationContext()
te dará el identificador del contexto de la aplicación. Preferiblemente debería usar el contexto de la aplicación cuando se la pase a la db.
La forma más fácil y precisa de obtener el contexto del fragmento que encontré es obtenerlo directamente desde ViewGroup
cuando onCreateView
método onCreateView
, al menos aquí está seguro de no obtener el valor nulo para getActivity()
:
public class Animal extends Fragment {
Context thiscontext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
thiscontext = container.getContext();
La forma más sencilla es usar getActivity()
. Pero creo que la mayor confusión de usar el método getActivity()
para obtener el contexto aquí es una excepción de puntero nulo.
Para esto, primero verifique con el método isAdded()
que determinará si se agrega o no, y luego podemos usar getActivity()
para obtener el contexto de la Actividad.
Necesito el contexto para usar el fragmento arrayAdapter IN, cuando estaba usando el error getActivity ocurre pero cuando lo reemplazo con getContext funciona para mí
listView LV=getView().findViewById(R.id.listOFsensors);
LV.setAdapter(new ArrayAdapter<String>(getContext(),android.R.layout.simple_list_item_1 ,listSensorType));
Otro enfoque alternativo es:
Puedes obtener el contexto usando:
getActivity().getApplicationContext();
Para Kotlin puedes usar el context
directamente en fragmentos. Pero en algunos casos encontrará un error como
Tipo de falta de coincidencia: el tipo inferido es contexto? pero se esperaba contexto
para eso puedes hacer esto
val ctx = context ?: return
textViewABC.setTextColor(ContextCompat.getColor(ctx, android.R.color.black))
Para hacer la respuesta anterior, puede anular el método de fragmento onAttach
:
public static class DummySectionFragment extends Fragment{
...
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
DBHelper = new DatabaseHelper(activity);
}
}
Puede usar getActivity()
, que devuelve la actividad asociada con un fragmento.
La actividad es un contexto (ya que la actividad amplía el contexto) .
Puedes llamar a getActivity()
o,
public void onAttach(Context context) {
super.onAttach(context);
this.activity = (CashActivity) context;
this.money = this.activity.money;
}
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
devuelve null algunas veces, por lo tanto, siempre verifique el método de fragmento isAdded() antes de obtener el contexto. getActivity()
.
También puede obtener el contexto del parámetro inflater
, al anular onCreateView
.
public static class MyFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
/* ... */
Context context = inflater.getContext();
/* ... */
}
}
También puedes usar:
inflater.getContext();
pero preferiría usar
getActivity()
o
getContext
Tienes diferentes opciones:
- Si su minSDK <= 21, entonces puede usar
getActivity()
, ya que este es unContext
. - Si su minSDK es> = 23, entonces puede usar
getContext()
.
Si no necesita admitir versiones anteriores, vaya con getContext()
.
Utilizar fragmentos de la biblioteca de soporte .
android.support.v4.app.Fragment
y luego anular
void onAttach (Context context) {
this.context = context;
}
De esta manera, puede estar seguro de que el contexto siempre será un valor no nulo.
para obtener el contexto dentro del Fragmento será posible usando getActivity()
:
public Database()
{
this.context = getActivity();
DBHelper = new DatabaseHelper(this.context);
}
- Tenga cuidado, para obtener la
Activity
asociada con el fragmento utilizandogetActivity()
, puede usarla pero no se recomienda que cause pérdidas de memoria.
Creo que un mejor enfoque debe ser obtener la Activity
del método onAttach()
:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
context = activity;
}
getActivity()
es un hijo de Context, por lo que debería funcionar para ti
getContext()
vino en la API 23. Reemplácelo con getActivity () en todas partes del código.
A ver si soluciona el error. Trate de usar métodos que se encuentren entre el nivel de API objetivo y mínimo, de lo contrario este error se producirá.
El método getContext () ayuda a usar el contexto de la clase en una actividad de fragmento.
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
context=activity;
}
public class MenuFragment extends Fragment implements View.OnClickListener {
private Context mContext;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
FragmentMenuBinding binding=FragmentMenuBinding.inflate(inflater,container,false);
View view=binding.getRoot();
mContext=view.getContext();
return view;
}
}