uso studio from fragments example dinamicos context application java android android-fragments android-context

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 un Context .
  • 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 utilizando getActivity() , 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; } }