web-dev-qa-db-ja.com

onCreateのjava.lang.NoSuchMethodException

Google Playのクラッシュログにクラッシュが見られ、本当に困惑しています。

Java.lang.RuntimeException: 
  at Android.app.ActivityThread.performLaunchActivity (ActivityThread.Java:3086)
  at Android.app.ActivityThread.handleLaunchActivity (ActivityThread.Java:3229)
  at Android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.Java:78)
  at Android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.Java:108)
  at Android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.Java:68)
  at Android.app.ActivityThread$H.handleMessage (ActivityThread.Java:1926)
  at Android.os.Handler.dispatchMessage (Handler.Java:106)
  at Android.os.Looper.loop (Looper.Java:214)
  at Android.app.ActivityThread.main (ActivityThread.Java:6981)
  at Java.lang.reflect.Method.invoke (Native Method)
  at com.Android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.Java:493)
  at com.Android.internal.os.ZygoteInit.main (ZygoteInit.Java:1445)
Caused by: androidx.fragment.app.Fragment$InstantiationException: 
  at androidx.fragment.app.Fragment.instantiate (Fragment.Java:462)
  at androidx.fragment.app.FragmentContainer.instantiate (FragmentContainer.Java:50)
  at androidx.fragment.app.FragmentState.instantiate (FragmentState.Java:80)
  at androidx.fragment.app.FragmentManagerImpl.restoreAllState (FragmentManager.Java:3109)
  at androidx.fragment.app.FragmentController.restoreAllState (FragmentController.Java:158)
  at androidx.fragment.app.FragmentActivity.onCreate (FragmentActivity.Java:344)
  at androidx.appcompat.app.AppCompatActivity.onCreate (AppCompatActivity.Java:85)
  at com.autotask.jbarra.kotlinmvvm.MainActivity.onCreate (MainActivity.kt:102)
  at Android.app.Activity.performCreate (Activity.Java:7326)
  at Android.app.Activity.performCreate (Activity.Java:7317)
  at Android.app.Instrumentation.callActivityOnCreate (Instrumentation.Java:1271)
  at Android.app.ActivityThread.performLaunchActivity (ActivityThread.Java:3066)

Caused by: Java.lang.NoSuchMethodException: 
  at Java.lang.Class.getConstructor0 (Class.Java:2328)
  at Java.lang.Class.getConstructor (Class.Java:1725)
  at androidx.fragment.app.Fragment.instantiate (Fragment.Java:443)

実は、メインアクティビティの102行目は特別なものではありません

    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState) //This is line 102

何が原因でしょうか? oncreateがそのようなメソッドをスローしないのはなぜですか?一部のユーザーのデバイスで発生しており、再現することができません。

9
clavio

アクティビティはインスタンス状態バンドルから復元されています。復元操作の一部は、フラグメントの再作成です。

アクティビティにフラグメントがあり、フラグメントクラスにはフレームワークに必要な0引数のコンストラクターがありません。

8
laalto

私のアクティビティには、deperecatedコンストラクタを使用していたFragmentPagerAdapterがありました。私が変更され

class MyPagerAdapter(
        fragmentManager: FragmentManager,
        private val myActivity: MyActivity
    ) : FragmentPagerAdapter(fragmentManager) // DEPRECATED

class MyPagerAdapter(
        fragmentManager: FragmentManager,
        private val myActivity: MyActivity
    ) : FragmentPagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT)

問題を修正したようです

1
Danpe

いくつかの検索の後、私は最終的に問題を修正しました。 3つのことを確認する必要があります。

  1. フラグメントには0引数のコンストラクターが必要です。ベストプラクティスは次のようなことです。
  2. 呼び出し元でコールバックを使用している場合は、getContextがnullかどうかを確認する必要があります(そうしないと、NullPointerExceptionが発生します)
  3. 画面の向きが変わった場合のケースをテストすることを忘れないでください。これにより、フラグメントの状態の復元による潜在的な問題を再現できます。

サンプルコード例:

    public class MyDialogFragment extends DialogFragment{
     private String id;

     public static MyDialogFragment newInstance(String id) {
        MyDialogFragment f = new MyDialogFragment ();

        Bundle args = new Bundle();
        if(id!= null){
            args.putString("id", id);
        }
        f.setArguments(args);

        return f;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(savedInstanceState != null){
            id= savedInstanceState.getString("id");
        }
    }
    }
1
Zhar