フラグメントコンストラクタが見つかりませんでした 質問する

フラグメントコンストラクタが見つかりませんでした 質問する

一部のデバイスで問題が発生しており、クラッシュ分析でエラーが発生しています。多くのユーザー デバイスでこの問題が発生していますが、私のデバイスでは正常に動作しています。

アクティビティを開始できません ComponentInfo{com.ox.outloks.new/com.ox.outloks.new.activities.MainDrawerActivity}: android.support.v4.app.Fragment$InstantiationException: フラグメント com.alchemative.outfitters.outfitters.fragments.ProductsFragment をインスタンス化できません: フラグメント コンストラクターが見つかりませんでした

アクティビティ中の行でエラーが発生していますsuper.onCreate(保存されたインスタンス状態);

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

ProductsFragmentコンストラクタはこちら

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

ベストアンサー1

作成したすべての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)が保持されます。

おすすめ記事