1. ホーム
  2. android

[解決済み] Fragment のコンストラクタが見つかりません。

2023-06-23 21:51:02

質問

いくつかのデバイスで問題に直面し、クラッシュ解析でエラーが発生します。多くのユーザー デバイスがこの問題に直面していますが、私のデバイスでは問題なく動作しています。

Unable to start activity ComponentInfo{com.ox.outloks.new/com.ox.outloks.new.activities.MainDrawerActivity}: android.support.v4.app.Fragment$InstantiationException.InstantiationException.Com.ox.outloks.new.Fragment$Activity.Unable to instantiate fragment: Unable to instantiate fragment com.alchemative.outfitters.fragments.ProductsFragment: Fragment constructorが見つかりませんでした。

エラーはアクティビティにある行で発生しています。 super.onCreate(savedInstanceState)です。

  @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

ProductsFragmentのコンストラクタです。

    @SuppressLint("ValidFragment")
public ProductsFragment(String id) {
    categoryID = id;
}

どのように解決するのですか?

すべて Fragment クラスは が必要です。 は、パブリックで引数のないコンストラクタを持たなければなりません。一般的に、ベストプラクティスは、単にどんなコンストラクタも全く定義せず、Javaがあなたのためにデフォルトコンストラクタを生成することに頼ることです。しかし、このような書き方もできます。

public ProductsFragment() {
    // doesn't do anything special
}

フラグメントに追加情報が必要な場合、例えば String id のように、フラグメントに追加情報が必要な場合、一般的なパターンとして newInstance() を使用する静的なファクトリーメソッドです。 Bundle を使用して、その情報をフラグメントに与えます。

public static ProductsFragment newInstance(String id) {
    Bundle args = new Bundle();
    args.putString("id", id);
    ProductsFragment f = new ProductsFragment();
    f.setArguments(args);
    return f;
}

では new ProductsFragment(id) を呼び出すのではなく ProductsFragment.newInstance(id) . そして、フラグメントの内部では、id にアクセスするために getArguments().getString("id") .

引数バンドルを利用することで、(特別なコンストラクタを作成する代わりに)フラグメントは Android フレームワークによって破棄および再作成することができ(例:ユーザーが電話を回転させた場合)、必要な情報(ID)は持続されます。