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

hia*_*ngh 5 android constructor android-fragments

片段中有默认构造函数,我想知道它的用途以及它提供的功能?我在没有它的情况下运行代码它工作得很好,我在删除它时找不到任何错误

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);
      }
   }
Run Code Online (Sandbox Code Playgroud)

小智 5

    \n
  • 当方向改变时,Android 框架决定重新创建我们的片段。Android 调用片段的无参构造函数。它不知道我们创建了什么构造函数。
  • \n
  • fragment.argument = bundle \xe2\x86\x92 在 newInstance 中,我们将包传递到其中。因此,当我们创建一个 newInstance 时,android 将提取该包并存储它。因此,当 android 方向更改时,android 将使用无参数构造函数重新创建片段,并且
  • \n
  • 可以将包附加到片段,因为它之前已经存储了包。稍后我们可以使用 getArgument 再次访问该数据,例如 ( val video_id = argument?.getLong(EXTRA_VIDEO_ID )
  • \n
  • 所以系统恢复一个Fragment
  • \n
  • 它会自动恢复我们的包
  • \n
  • 将片段的状态恢复到相同的状态。
  • \n
\n


Jam*_*Fry 3

请参阅此问题和评论/答案。简而言之,Fragment 需要有一个无参数构造函数,供 Android 系统实例化它们(我相信活动历史记录管理器会执行此操作,等等)。

如果构造函数是显式的,就像在未更改的示例中一样,那么它确实可以确保添加其他构造函数时无参数构造函数可以工作,并且注释可以作为提醒(或者原作者并没有真正理解其目的)和/或语言如何工作)。

如果无参数构造函数可能是隐式的 - 即它在源代码中被省略,并且没有声明其他构造函数 - 那么根据JLS在幕后创建一个构造函数(这就是当您在示例中删除构造函数时发生的情况) :

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

如果声明的类是原始类 Object,则默认构造函数的主体为空。否则,默认构造函数将简单地调用不带参数的超类构造函数。