Le fragment doit être une classe statique publique pour être correctement recréée à partir de l'état de l'instance
Après la mise à jour pour la dernière support référentiel,
compile 'com.android.support:appcompat-v7:24.2.0'
compile 'com.android.support:design:24.2.0'
compile 'com.android.support:percent:24.2.0'
compile 'com.android.support:recyclerview-v7:24.2.0'
J'ai la bizarre exception.
java.lang.IllegalStateException: Fragment null must be a public static class to be properly recreated from instance state.
at android.support.v4.app.BackStackRecord.doAddOp(BackStackRecord.java:435)
at android.support.v4.app.BackStackRecord.add(BackStackRecord.java:414)
at android.support.v4.app.DialogFragment.show(DialogFragment.java:154)
at com.androidapp.base.BaseActivity.showDialogFragment(BaseActivity.java:78)
at com.androidapp.MainActivity.showNewDialog(MainActivity.java:304)
at com.androidapp.MainActivity$6.onClick(MainActivity.java:228)
Dans mon BaseActivity classe, j'ai créé une ré-utilisable fragment qui peut être utilisé dans l'activité de classe qui étend la BaseActivty
public void showDialogFragment(DialogFragment newFragment) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog");
if (prev != null) {
ft.remove(prev);
}
ft.addToBackStack("dialog");
newFragment.show(ft, "dialog");
}
Retour à la MainActivty j'ai utilisé le fragment comme ça,
public class MainActivity extends BaseActivity {
@SuppressLint("ValidFragment")
public void showNewDialog(int type, String title, String message) {
final DialogNew dialog = new DialogNew() {
@Override
public void success(boolean isLandscape) {
.......
}
@Override
public void cancel() {
}
};
dialog.setArgs(title, message);
super.showDialogFragment(dialog);
}
}
La DialogNew classe est ci-dessous,
public abstract class DialogNew extends DialogFragment {
private View rootView;
private String title;
private String message;
public void setArgs(String title, String message) {
Bundle args = new Bundle();
args.putString("title", title);
args.putString("message", message);
setArguments(args);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setStyle(STYLE_NO_TITLE, 0);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_new_dialog, container, false);
init();
setListeners();
return rootView;
}
public abstract void success(boolean isLandscape);
public abstract void cancel();
}
PS: Le même code fonctionne avec les anciens de soutien référentiel.
source d'informationauteur Falling Into Infinity
Vous devez vous connecter pour publier un commentaire.
L'erreur n'est pas particulièrement étrange. Si vous ne recevaient pas cette erreur avant, que était bizarre.
Android détruit et recrée des fragments dans le cadre d'un changement de configuration (par exemple, la rotation de l'écran) et dans le cadre de la reconstruction d'une tâche si nécessaire (par exemple, l'utilisateur passe à une autre application, celle du processus est arrêté alors qu'il est dans le fond, ensuite, l'utilisateur essaie de revenir à votre application, tous à moins de 30 minutes). Android n'a pas les moyens de recréer un anonyme sous-classe de
DialogNew
.Faites régulièrement
public
classe Java (ou unpublic
static
classe imbriquée) qui s'étendDialogNew
et a une logique d'entreprise, en remplacement de l'anonyme sous-classe deDialogNew
que vous utilisez actuellement.Edit: Vous ne voulez probablement pas à le faire... Voir les commentaires.
L'exemple de code ressemble à ce que j'avais suggéré sur iciet j'ai découvert récemment que la solution que j'ai eu il n'y a pas de travail plus. J'ai mis à jour ma réponse là pour Java7, mais si vous avez Java8 la solution est super facile:
(Je n'ai pas testé encore)
Puis l'activité Principale: