Po aktualizacji do najnowszej repozytorium wsparcia,Fragment musi być publiczny klasa statyczna być prawidłowo odtworzone z instancji stanu
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'
Otrzymuję dziwny wyjątek.
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)
W moim BaseActivity klasy I utworzeniu fragmentu wielokrotnego użytku, które mogą być wykorzystane w klasie aktywności, który rozszerza 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");
}
Powrót do MainActivty I użyłem tego fragmentu,
DialogNew klasa jest poniżej
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: Ten sam kod działa ze starszymi repozytorium wsparcia.
Dlaczego skrót 'DialogNew' jest abstrakcyjny? Nie można utworzyć instancji klasy abstrakcyjnej. – Vucko
@ Vucko, w porządku. Robiąc takie rzeczy tak masz rację, że nie możesz * utworzyć abstrakcji * zamiast tego zainicjować anonimową klasę, która rozszerza tę klasę abstrakcji. W skrócie nie ma z tym problemu. – Enzokie
z tym samym błędem w wersji biblioteki wsparcia 24.2.1 – Meet