片段中有默认构造函数,我想知道它的用途和它提供的功能是什么?我没有它运行代码它完美地工作,我发现删除它没有任何错误
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);
}
}
答案 0 :(得分:1)
见question and comments / answers。简而言之,Fragments需要有一个no-args构造函数供Android系统实例化它们(我相信活动历史记录管理器会这样做等)。
如果构造函数是显式的,就像在未更改的示例中一样,那么确实如果添加了其他构造函数则确保no-args构造函数可以工作,并且注释用作提醒(或者原始作者不是真的了解语言的目的和/或方式。
如果no-args构造函数可能是隐式的 - 即它在源中被省略并且没有声明其他构造函数 - 则根据the JLS在幕后创建一个(这是删除时发生的情况)你的例子中的构造函数):
如果类不包含构造函数声明,则为默认值 没有形式参数且没有throws子句的构造函数 隐含地宣布。
如果声明的类是原始类Object,那么 默认构造函数有一个空体。否则,默认 构造函数只调用没有的超类构造函数 参数。
答案 1 :(得分:1)
用于设备必须恢复片段状态的情况。不会传递任何数据,并且将创建默认片段,然后将恢复状态。由于系统无法知道您在构造函数或newInstance中传递了什么,因此将使用默认构造函数,并且在使用默认构造函数实际实例化片段之后,应通过onCreate传递保存的bundle。