2017-02-11 16 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. Короче говоря, Fragments должен иметь конструктор no-args для системы Android для их создания (я считаю, что менеджер истории событий делает это и т. Д.).

Если конструктор явный, как в неизмененном примере, то действительно существует, чтобы конструктор no-args работал, если добавлены другие конструкторы, а комментарий служит напоминанием (это или автор не сделал действительно понять цель и/или как работает язык).

Если конструктор no-args может быть неявным - то есть он опущен в источнике, а других объявленных конструкторов нет - тогда создается за кулисами в соответствии с the JLS (это произошло, когда вы удалили конструктор в ваш пример):

Если класс не содержит конструктор деклараций, то по умолчанию конструктора без формальных параметров и не кидает оговорку неявно объявляется.

Если объявляемый класс является первоклассным объектом класса, то конструктор по умолчанию имеет пустое тело. В противном случае конструктор по умолчанию просто вызывает конструктор суперкласса без аргументов .

0

Используется в том случае, если устройству необходимо восстановить состояние фрагмента. Данные не будут переданы, и будет создан фрагмент по умолчанию, после чего состояние будет восстановлено. Поскольку система не имеет возможности узнать, что вы передали в своем конструкторе или вашем newInstance, будет использоваться конструктор по умолчанию, и сохраненный пакет должен быть передан через onCreate после того, как фрагмент будет фактически создан с помощью конструктора по умолчанию.

+0

Конструктор по умолчанию будет в любом случае создан java-компилятором, если вы не переопределили каких-либо аргументированных конструкторов в своем своя. – Kushan