8

私はGoogleプレイのようなレイアウトを作っています。私はフラグメントを必要とするViewPagerを使用しています。一部のサイトではフラグメントに空のコンストラクタが必要だと言われているので、少し混乱していますが、developer.android.comの例にはコンストラクタが含まれていません。コードは次のようになります。Android:ViewPagerで使用されているフラグメントに空のコンストラクタを追加する必要があります

public static class DemoObjectFragment extends Fragment { 
    public static final String ARG_OBJECT = "object"; 

    @Override 
    public View onCreateView(LayoutInflater inflater, 
      ViewGroup container, Bundle savedInstanceState) { 
     // The last two arguments ensure LayoutParams are inflated 
     // properly. 
     View rootView = inflater.inflate(
       R.layout.fragment_collection_object, container, false); 
     Bundle args = getArguments(); 
     ((TextView) rootView.findViewById(android.R.id.text1)).setText(
       Integer.toString(args.getInt(ARG_OBJECT))); 
     return rootView; 
    } 
} 

したがって、コンストラクタをフラグメントに含める必要がありますか、コンストラクタを省略することはできますか?

答えて

10

Javaコンパイラは、デフォルトの引数なしコンストラクタ(質問で参照する「空のコンストラクタ」)をコンストラクタを備えていないクラスに自動的に追加します。

次の空のクラス:あなたが明示的に無引数を追加していないことが要求される

public class A { 

    public A() { 
    } 

} 

public class A { 
} 

が空のボディと引数なしのコンストラクタを持つ以下のクラスに相当します1つ以上の引数を持つ別のコンストラクタをインクルードする場合にのみ、この場合はコンパイラがそれを追加しないためです。

+0

空のコンストラクタを追加しても間違いありません。 – Xander

+0

引数なしのコンストラクタを空のボディに追加しても差はありません。 –

+0

「引数が1つ以上ある別のコンストラクタを組み込む場合のみ」とはどういう意味ですか?それはフラグメントクラスのコンストラクタのためだけであるか、あるいはフラグメント内の例えばASyncTaskのコンストラクタのためでもありますか? – Xander

1

コンストラクタを追加しない場合、コンストラクタを呼び出すとスーパーコンストラクタが参照されます(空のコンストラクタを作成する場合と同じです)。しかし、他のコンストラクタを作成する場合(フラグメント化では望ましくないので、onCreateで何をしたいのかを決めると、フラグメントは常にインスタンス化されることはありませんが、システムがフラグメントをインスタンス化し、空のコンストラクタが呼び出されることがあります)空のものも提供する必要があります。

+1

フラグメントに空のコンストラクタ以外のコンストラクタは使用しないでください。代わりにインスタンス化パターンを使用します。 – Warpzit

+1

...より多くのコンピューティングパワーをシリアル化してバンドルにデシリアライズする複雑なオブジェクトを渡したい場合を除き... –

関連する問題