java android - Usando contexto en un fragmento




example fragments (21)

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();
        /* ... */
    }
}

¿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);
}

También puedes usar:

inflater.getContext();

pero preferiría usar

getActivity()

o

getContext

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;
}

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));

Creo que puedes usar

public static class MyFragment extends Fragment {
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

      Context context = getActivity.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.


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.


Otro enfoque alternativo es:

Puedes obtener el contexto usando:

getActivity().getApplicationContext();

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


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();

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() .


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.


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á.


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.


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))

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() .


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 .


Puede usar getActivity() , que devuelve la actividad asociada con un fragmento.
La actividad es un contexto (ya que la actividad amplía el contexto) .


1) Declara tu archivo de diseño.

public View onCreateView(LayoutInflater inflater,ViewGroup container, 
                                 Bundle savedInstanceState) {
    return inflate(R.layout.myfragment, container, false);
}

2) Entonces, obtén el id de tu vista

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    TextView nameView = (TextView) view.findViewById(R.id.textview1);
}




java android android-fragments android-context