2017-02-11 10 views
2

フラグメントにデフォルトのコンストラクタがありますが、その使用方法とその機能が分かりますか?そして私はそれが完全に働いたことのないコードを実行し、私はフラグメントにデフォルトのコンストラクタがあるのはなぜですか?

public class SongListFragment extends Fragment { 

    private static final String SONG_IDS = "song_ids"; 

    // TODO: Rename and change types of parameters 
    private int[] songIds; 
    private OnFragmentInteractionListener mListener; 

    public SongListFragment() { 
     // Required empty public constructor 
    } 

    // TODO: Rename and change types and number of parameters 
    public static SongListFragment newInstance(int[] songIds) { 
     SongListFragment fragment = new SongListFragment(); 
     Bundle args = new Bundle(); 
     args.putIntArray(SONG_IDS, songIds); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
     songIds = getArguments().getIntArray(SONG_IDS); 
     } 
    } 

    @Override 
    public View onCreateView(
     LayoutInflater inflater, 
     ViewGroup  container, 
     Bundle   savedInstanceState) 
    { 
     // Inflate the layout for this fragment 
     return inflater.inflate(R.layout.fragment_song_list, container, false); 
    } 

    // TODO: Rename method, update argument and hook method into UI event 
    public void onButtonPressed(Uri uri) { 
     if (mListener != null) { 
     mListener.onSongSelected(10); 
     } 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof OnFragmentInteractionListener) { 
     mListener = (OnFragmentInteractionListener) context; 
     } 
     else { 
     throw new RuntimeException(context.toString() + 
      " must implement OnFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 


    public interface OnFragmentInteractionListener { 

     public void onSongSelected(int songId); 
     } 
    } 
+1

デバイスがフラグメントの状態を復元する必要がある場合に使用します。データは渡されず、デフォルトのフラグメントが作成され、状態が復元されます。システムはあなたのコンストラクタまたはnewInstanceで渡されたものを知る方法がないので、デフォルトコンストラクタが使用され、保存されたバンドルは渡されるべきです – Kushan

答えて

0

それを除去するのいずれかのエラーを見つけることができないこのquestion and comments/answersを参照してください。要するに、フラグメントは、Androidシステムがそれらをインスタンス化するための引数のないコンストラクタを持つ必要があります(私はアクティビティ履歴マネージャがこれを行うと信じています)。

変更されていない例のように、コンストラクタが明示的である場合は、他のコンストラクタが追加されていて、コメントがリマインダとして機能している場合は、目的や言語の仕組みを実際に理解している)。

no-argsコンストラクタが暗黙的である場合、つまりソースでは省略され、他のコンストラクタは宣言されていない場合は、the JLSとしてシーンの背後に作成されます(これはコンストラクタをあなたの例):

クラスは、コンストラクタの宣言が含まれていない場合は、正式なパラメータなしでデフォルト コンストラクタがthrows節は、暗黙的に宣言 です。

宣言されているクラスが基本クラスObjectの場合、 デフォルトのコンストラクタには空のボディがあります。それ以外の場合、デフォルトの コンストラクタは、単に 引数を持たないスーパークラスコンストラクタを呼び出します。

0

フラグメントの状態を復元する必要がある場合に使用します。データは渡されず、デフォルトのフラグメントが作成され、状態が復元されます。システムはコンストラクタまたはnewInstanceで渡されたものを知る方法がないため、既定のコンストラクタが使用され、保存されたバンドルは、フラグメントが実際に既定のコンストラクタでインスタンス化された後にonCreateを介して渡されます。

+0

引数コンストラクタがオーバーライドされていないと、デフォルトコンストラクタはJavaコンパイラによって作成されます自分の。 – Kushan

関連する問題