android - programacion - java.lang.IllegalStateException: Fragmento no asociado a la Actividad
manual de android en pdf (11)
Adopté el siguiente enfoque para manejar este problema. Creó una nueva clase que actúa como un contenedor para métodos de actividad como este
public class ContextWrapper {
public static String getString(Activity activity, int resourceId, String defaultValue) {
if (activity != null) {
return activity.getString(resourceId);
} else {
return defaultValue;
}
}
//similar methods like getDrawable(), getResources() etc
}
Ahora, donde sea que necesite acceder a recursos desde fragmentos o actividades, en lugar de llamar directamente al método, uso esta clase.
En caso de que el
context
actividad no sea
null
, devuelve el valor del activo y en caso de que el
context
sea nulo, pasa un valor predeterminado (que también especifica el llamador de la función).
Importante Esta no es una solución, es una forma efectiva de manejar este bloqueo con gracia. Debería agregar algunos registros en los casos en que obtenga una instancia de actividad como nula e intente solucionarlo, si es posible.
Raramente recibo este error al hacer una llamada a la API.
java.lang.IllegalStateException: Fragment not attached to Activity
Intenté poner el código dentro del método
isAdded()
para verificar si el fragmento se agrega actualmente a su actividad, pero todavía rara vez recibo este error.
No entiendo por qué sigo recibiendo este error.
¿Como puedo prevenirlo?
Se muestra un error en la línea
cameraInfo.setId(getResources().getString(R.string.camera_id));
A continuación se muestra el ejemplo de llamada de API que estoy haciendo.
SAPI.getInfo(getActivity(),
new APIResponseListener() {
@Override
public void onResponse(Object response) {
cameraInfo = new SInfo();
if(isAdded()) {
cameraInfo.setId(getResources().getString(R.string.camera_id));
cameraInfo.setName(getResources().getString(R.string.camera_name));
cameraInfo.setColor(getResources().getString(R.string.camera_color));
cameraInfo.setEnabled(true);
}
}
@Override
public void onError(VolleyError error) {
mProgressDialog.setVisibility(View.GONE);
if (error instanceof NoConnectionError) {
String errormsg = getResources().getString(R.string.no_internet_error_msg);
Toast.makeText(getActivity(), errormsg, Toast.LENGTH_LONG).show();
}
}
});
Algunas veces esta excepción es causada por un error en la implementación de la biblioteca de soporte. Recientemente tuve que bajar de 26.1.0 a 25.4.0 para deshacerme de él.
El ciclo de vida del fragmento es muy complejo y está lleno de errores, intente agregar:
Activity activity = getActivity();
if (isAdded() && activity != null) {
...
}
En Fragment use
isAdded()
Volverá verdadero si el fragmento está actualmente adjunto a Activity.
Si quieres consultar dentro de la Actividad
Fragment fragment = new MyFragment();
if(fragment.getActivity()!=null)
{ // your code here}
else{
//do something
}
Espero que ayude a alguien
Encontré el método isAdded() Very Very Solution Solution, que es uno de los métodos de fragmento para identificar que este fragmento actual está conectado a su Actividad o no.
podemos usar esto como en todas partes en la clase de fragmento como:
if(isAdded())
{
// using this method, we can do whatever we want which will prevent **java.lang.IllegalStateException: Fragment not attached to Activity** exception.
}
Este error ocurre debido al efecto combinado de dos factores:
-
La solicitud HTTP, cuando se completa, invoca
onResponse()
oonError()
(que funcionan en el hilo principal) sin saber si laActivity
todavía está en primer plano o no. Si laActivity
se ha ido (el usuario navegó a otra parte),getActivity()
devuelve nulo. -
La
Response
Volea se expresa como una clase interna anónima, que implícitamente tiene una fuerte referencia a la clase deActivity
externa. Esto da como resultado una pérdida de memoria clásica.
Para resolver este problema, siempre debe hacer:
Activity activity = getActivity();
if(activity != null){
// etc ...
}
y también, use
isAdded()
en el método
onError()
también:
@Override
public void onError(VolleyError error) {
Activity activity = getActivity();
if(activity != null && isAdded())
mProgressDialog.setVisibility(View.GONE);
if (error instanceof NoConnectionError) {
String errormsg = getResources().getString(R.string.no_internet_error_msg);
Toast.makeText(activity, errormsg, Toast.LENGTH_LONG).show();
}
}
}
Este error puede ocurrir si está creando una instancia de un fragmento que de alguna manera no se puede instanciar:
Fragment myFragment = MyFragment.NewInstance();
public classs MyFragment extends Fragment {
public void onCreate() {
// Some error here, or anywhere inside the class is preventing it from being instantiated
}
}
En mi caso, me encontré con esto cuando intenté usar:
private String loading = getString(R.string.loading);
Este problema ocurre cada vez que llama a un contexto que no está disponible o es nulo cuando lo llama. Esto puede ser una situación cuando está llamando al contexto del hilo de actividad principal en un hilo de fondo o al contexto del hilo de fondo en el hilo de actividad principal.
Por ejemplo, actualicé mi cadena de preferencia compartida como la siguiente.
editor.putString("penname",penNameEditeText.getText().toString());
editor.commit();
finish();
Y llamó a finish () justo después. Ahora lo que hace es que como commit se ejecuta en el hilo principal y detiene cualquier otro commit asíncrono si llega hasta que finalice. Entonces su contexto está vivo hasta que se completa la escritura. Por lo tanto, el contexto anterior es en vivo, lo que provoca el error.
Por lo tanto, asegúrese de volver a comprobar su código si hay algún código que tenga este problema de contexto.
Esto sucede cuando el fragmento no tiene contexto, por lo que el método getActivity () devuelve nulo. compruebe si usa el contexto antes de obtenerlo, o si la Actividad ya no existe. use el contexto en fragment.onCreate y después de la respuesta de la API, por lo general, este problema
puedo llegar tarde pero puedo ayudar a alguien ..... La mejor solución para esto es crear una instancia de clase de aplicación global y llamarla en el fragmento particular donde no se adjunta su actividad
como abajo
icon = MyApplication.getInstance().getString(R.string.weather_thunder);
Aquí está la clase de aplicación
public class MyApplication extends Application {
private static MyApplication mInstance;
private RequestQueue mRequestQueue;
@Override
public void onCreate() {
super.onCreate();
mInstance = this;
}
public static synchronized MyApplication getInstance() {
return mInstance;
}
}
Excepción: java.lang.IllegalStateException: Fragment
DeadlineListFragment {ad2ef970} no adjunto a la actividad
Categoría: Ciclo de vida
Descripción : al realizar operaciones que requieren mucho tiempo en el subproceso en segundo plano (p. Ej., AsyncTask), se ha creado un nuevo Fragmento mientras tanto y se desconectó de la Actividad antes de que finalizara el subproceso en segundo plano. El código en el subproceso de la interfaz de usuario (por ejemplo, onPostExecute) invoca un Fragmento desconectado, lanzando tal excepción.
Solución fija:
-
Cancele el hilo de fondo al pausar o detener el Fragmento
-
Use isAdded () para verificar si el fragmento está adjunto y luego obtener getResources () de la actividad.