java - uso - Usando contexto en un fragmento




uso de fragments en android studio (16)

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.

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

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,


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

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

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


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


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




android-context