18

私は持っています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>

この例外が発生する理由、および/またはそれを再現する方法を知っている人はいますか?

4

3 に答える 3

20

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()

于 2013-04-05T09:53:28.577 に答える