2017-02-11 56 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

相关问题