Android InstantiationException с фрагментом (он открыт)
У меня есть Fragment
(это не внутренний класс, и он не имеет никакого конструктора)
public class PreferenceListFragment extends ListFragment implements OnClickListener
Я получаю этот отчет о сбоях в консоли разработчика Android:
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.redacted.redacted/com.redacted.redacted.PreferenceActivity}:
android.support.v4.app.Fragment$InstantiationException:
Unable to instantiate fragment com.redacted.redacted.PreferenceListFragment$3:
make sure class name exists, is public, and has an empty constructor that is
public
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1750)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1766)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:2960)
at android.app.ActivityThread.access$1600(ActivityThread.java:127)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:945)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3818)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:875)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:633)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.support.v4.app.Fragment$InstantiationException:
Unable to instantiate fragment com.redacted.redacted.PreferenceListFragment$3:
make sure class name exists, is public, and has an empty constructor that
is public
at android.support.v4.app.Fragment.instantiate(Fragment.java:399)
at android.support.v4.app.FragmentState.instantiate(Fragment.java:97)
at android.support.v4.app.FragmentManagerImpl.restoreAllState(FragmentManager.java:1760)
at android.support.v4.app.FragmentActivity.onCreate(FragmentActivity.java:200)
at com.redacted.redacted.PreferenceActivity.onCreate(PreferenceActivity.java:37)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1710)
... 12 more
Caused by: java.lang.InstantiationException:
com.redacted.redacted.PreferenceListFragment$3
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1409)
at android.support.v4.app.Fragment.instantiate(Fragment.java:388)
... 18 more
Я не могу воспроизвести это на любом из моих тестовых устройств.
Здесь PreferenceActivity.onCreate
, где происходит исключение:
public class PreferenceActivity extends FragmentActivity{
PreferenceListFragment frag;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.preference);
frag = (PreferenceListFragment) getSupportFragmentManager().
findFragmentById(R.id.preference_list_frag);
frag.setState(AlarmPreferenceState.Selected);
frag.setIsTwoPane(false);
}
.
.
.
}
И вот R.layout.preference
:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment class="com.redacted.redacted.PreferenceListFragment"
android:id="@+id/preference_list_frag"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</FrameLayout>
Кто-нибудь знает, почему я могу получить это исключение и/или как его воспроизвести?
Ответы
Ответ 1
У вас MUST
есть пустой публичный конструктор. Тот, кто сказал вам, что у вас нет конструктора фрагментов, направил вас в неправильном направлении.
То, что они могли сказать вам, заключается в том, что у него нет конструктора, который принимает аргументы, поскольку они не могут быть вызваны системой при повторном создании фрагментов. В этом случае используйте пример в документах для предоставления аргументов вашему фрагменту.
Цитируется из документов:
Все подклассы Fragment должны включать публичный пустой конструктор. Структура часто повторно создает экземпляр класса фрагмента, когда это необходимо, в частности во время восстановления состояния, и должно быть в состоянии найти этот конструктор для его создания. Если пустой конструктор недоступен, в некоторых случаях во время восстановления состояния произойдет исключение среды выполнения. [1], [2]
[1]: https://developer.android.com/reference/android/app/Fragment.html
[2]: https://developer.android.com/reference/android/app/Fragment.html#Fragment()