为什么片段有默认构造函数?

时间:2017-02-11 10:24:41

标签: android android-fragments constructor

片段中有默认构造函数,我想知道它的用途和它提供的功能是什么?我没有它运行代码它完美地工作,我发现删除它没有任何错误

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);
      }
   }

2 个答案:

答案 0 :(得分:1)

question and comments / answers。简而言之,Fragments需要有一个no-args构造函数供Android系统实例化它们(我相信活动历史记录管理器会这样做等)。

如果构造函数是显式的,就像在未更改的示例中一样,那么确实如果添加了其他构造函数则确保no-args构造函数可以工作,并且注释用作提醒(或者原始作者不是真的了解语言的目的和/或方式。

如果no-args构造函数可能是隐式的 - 即它在源中被省略并且没有声明其他构造函数 - 则根据the JLS在幕后创建一个(这是删除时发生的情况)你的例子中的构造函数):

  

如果类不包含构造函数声明,则为默认值   没有形式参数且没有throws子句的构造函数   隐含地宣布。

     

如果声明的类是原始类Object,那么   默认构造函数有一个空体。否则,默认   构造函数只调用没有的超类构造函数   参数。

答案 1 :(得分:1)

用于设备必须恢复片段状态的情况。不会传递任何数据,并且将创建默认片段,然后将恢复状态。由于系统无法知道您在构造函数或newInstance中传递了什么,因此将使用默认构造函数,并且在使用默认构造函数实际实例化片段之后,应通过onCreate传递保存的bundle。