2017-02-11 54 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系統實例化它(我相信活動歷史記錄管理器會這樣做,等等)。

如果構造函數是顯式的,就像在未改變的例子中一樣,那麼確實如果添加了其他構造函數,則確實無參數構造函數有效,並且該註釋用作提醒(或者原始作者沒有真正理解目的和/或語言是如何工作的)。

如果無參數的構造可能是隱含的 - 即它在源省略,並且沒有其他構造函數聲明 - 那麼一個場景按the JLS背後創建(這是當你在刪除構造發生了什麼你的例子):

如果一個類不包含任何構造函數聲明,那麼默認的構造函數 沒有正式參數,沒有throws子句是​​ 隱式聲明。

如果聲明的類是原始類Object,則默認構造函數具有空的主體。否則,構造函數的默認構造函數只會調用沒有參數 的超類構造函數。

0

它用於設備必須恢復片段狀態的情況。沒有數據將被傳遞,並且將創建一個默認片段,然後狀態將被恢復。由於系統無法知道您在構造函數或newInstance中傳遞的內容,所以將使用默認構造函數,並且在片段實際使用默認構造函數實例化後,應通過onCreate傳遞保存的包。

+0

如果您尚未覆蓋任何參數化構造函數,則Java編譯器將創建默認構造函數擁有。 – Kushan

相關問題