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.