Errores de Android: causados por: android.support.v4.app.Fragment$InstantiationException

Error:

Causado por: android.support.v4.app.Fragment$InstantiationException: no se puede crear una instancia del fragmento xxx: asegúrese de que el nombre de la clase exista, sea público y tenga un constructor vacío que sea público

razón:

Al cambiar a otras aplicaciones, se llamará al método onSaveInstanceState de FragmentActivity, y al ingresar nuevamente, se volverá a crear la Actividad, y se obtendrá el estado de instancia guardado en el método onCreate y se volverá a crear una instancia. Para más detalles, consulte el código fuente:

public static Fragment instantiate(Context context, String fname, @Nullable Bundle args) {
        try {
            Class<?> clazz = sClassMap.get(fname);
            if (clazz == null) {
                // Class not found in the cache, see if it's real, and try to add it
                clazz = context.getClassLoader().loadClass(fname);
                if (!Fragment.class.isAssignableFrom(clazz)) {
                    throw new InstantiationException("Trying to instantiate a class " + fname
                            + " that is not a Fragment", new ClassCastException());
                }
                sClassMap.put(fname, clazz);
            }
            Fragment f = (Fragment) clazz.getConstructor().newInstance();
            if (args != null) {
                args.setClassLoader(f.getClass().getClassLoader());
                f.setArguments(args);
            }
            return f;
        } catch (ClassNotFoundException e) {
            throw new InstantiationException("Unable to instantiate fragment " + fname
                    + ": make sure class name exists, is public, and has an"
                    + " empty constructor that is public", e);
        } catch (java.lang.InstantiationException e) {
            throw new InstantiationException("Unable to instantiate fragment " + fname
                    + ": make sure class name exists, is public, and has an"
                    + " empty constructor that is public", e);
        } catch (IllegalAccessException e) {
            throw new InstantiationException("Unable to instantiate fragment " + fname
                    + ": make sure class name exists, is public, and has an"
                    + " empty constructor that is public", e);
        } catch (NoSuchMethodException e) {
            throw new InstantiationException("Unable to instantiate fragment " + fname
                    + ": could not find Fragment constructor", e);
        } catch (InvocationTargetException e) {
            throw new InstantiationException("Unable to instantiate fragment " + fname
                    + ": calling Fragment constructor caused an exception", e);
        }
    }

Fragmento f = (Fragmento) clazz.getConstructor().newInstance();
La razón de esta línea de código es muy obvia. Al reconstruir el Fragmento, la reflexión llama al método de construcción sin argumentos del Fragmento. Si no hay argumentos se encuentra el método de construcción, fallará la creación.

Solución:

Agrega un constructor sin argumentos a un fragmento que solo tiene un constructor de parámetros.

Supongo que te gusta

Origin blog.csdn.net/u012230055/article/details/124560514
Recomendado
Clasificación