Bugs do Android——Causados por: android.support.v4.app.Fragment$InstantiationException

Erro:

Causado por: android.support.v4.app.Fragment$InstantiationException: não é possível instanciar o fragmento xxx: certifique-se de que o nome da classe exista, seja público e tenha um construtor vazio que seja público

razão:

Ao alternar para outras aplicações, o método onSaveInstanceState de FragmentActivity será chamado, e ao entrar novamente, a Activity será recriada, e saveInstanceState será obtido no método onCreate e reinstanciado. Para detalhes, consulte o código-fonte:

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

Fragment f = (Fragment) clazz.getConstructor().newInstance();
A razão para esta linha de código é muito óbvia. Ao reconstruir o Fragment, a reflexão chama o método de construção sem argumento do Fragment. Se não houver nenhum argumento método de construção for encontrado, a criação falhará.

Solução:

Adicione um construtor sem argumentos a um Fragment que tenha apenas um construtor de parâmetro.

おすすめ

転載: blog.csdn.net/u012230055/article/details/124560514