Как сделать DatePicker с DialogFragment и FragmentManager?

Итак, я был в этом какое-то время, и я не могу понять это. Я новичок в разработке Android, так что поддержите меня, пожалуйста. Я не был слишком знаком с созданием Datepicker, и я научился делать это устаревшим способом, просто чтобы освоиться. Использовал этот учебник, чтобы ускорить меня:

http://developer.android.com/resources/tutorials/views/hello-datepicker.html

Но теперь мне нужно изменить его, в основном, чтобы не использовать устаревший код, поэтому я осмотрелся и нашел 2 учебника, в основном этот:

http://www.kylebeal.com/2011/11/android-datepickerdialog-and-the-dialogfragment/

Проблема в том, что есть код, который не имеет смысла. В основном эта часть:

//create new DateDialogFragment
DateDialogFragment ddf = DateDialogFragment.newInstance(this, R.string.set_date, date);

ddf.setDateDialogFragmentListener(new DateDialogFragmentListener() {

    @Override
    public void dateDialogFragmentDateSet(Calendar date) {
        // update the fragment
        mDateDetailFragment.updateDate(date);
    }
});

ddf.show(getSupportFragmentManager(), "date picker dialog fragment");

Предполагается, что это то, что выполняется в классе активности, в котором он работает. Так что я как бы понимаю, что происходит в остальной части кода, и не стесняюсь смотреть на остальную часть, поскольку это, вероятно, поможет. Код, по сути, следует почти тому же маршруту, что и исходный код showDialog(). Реализация DatePickerDialog.onDateSetListener и возврат нового DatePickerDialog с очевидным исключением, заключающимся в использовании DialogFragment. Но тут я заблудился.

Частично причина в том, что я не совсем уверен, где onCreateDialog() возвращает этот новый DatePickerDialog. Если вы посмотрите на код, который я сказал, он не имеет смысла, и mDateDetailFragment, и getSupportFragmentManager() никогда не создавались и не появлялись где-либо еще, поэтому я не могу заставить код учебника работать. В Android Doc также упоминается, что вместо использования showDialog() я должен использовать как DialogFragment, так и FragmentManager, чего здесь также не делается. Только диалоговый фрагмент.

Итак, как и в заголовке, как именно я могу сделать DatPicker в неустаревшей форме? Я хотел бы попросить НЕ присылать мне ссылку и просто сказать, посмотрите здесь. Я сделал это. Поверьте мне. Если нет, то хотя бы объясните, что я пропустил, что имеет смысл. Кроме того, если бы кто-нибудь действительно мог сказать мне, куда метод onCreateDialog() отправляет DatePickerDialog, это также было бы чрезвычайно полезно. Я просто пытаюсь разобраться во всем этом, а не копировать и вставлять код (не то, чтобы он все равно работал). Большое спасибо, что нашли время, чтобы прочитать это, и если нужны какие-либо разъяснения, пожалуйста, спрашивайте.


person Andy    schedule 13.06.2012    source источник


Ответы (3)


Иду по порядку вашего поста... \

1) onCreateDialog возвращает диалог в DialogFragment.

2) Я не знаю о строке mDateDetailFragment.updateDate(date);... Я думаю, что он мог пропустить какой-то код. EDIT Нашел, это в одном из классов в zip-файле для его полной демонстрации.

3) Вы используете диспетчер фрагментов (это часть getSupportFragmentManager()):

ddf.show(getSupportFragmentManager(), "date picker dialog fragment");

Хорошо, тем не менее, вот как я это сделал (я использую DateSlider, но добавление Datepicker на его место должно быть достаточно простым для вас).

Во фрагменте/действии, вызывающем DialogFragment:

DialogFragment newFragment = new DateDialog();
newFragment.show(getFragmentManager(), "dialog"); 

И мой диалоговый фрагмент:

public class DateDialog extends DialogFragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    private DateSlider.OnDateSetListener mDateSetListener = new DateSlider.OnDateSetListener() {
        public void onDateSet(DateSlider view, Calendar selectedDate) {
            MemberAddFragment.startTxt.setText(String.format("%tB %te, %tY", selectedDate, selectedDate, selectedDate));
        }
    };

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Calendar c = Calendar.getInstance();  // Get calendar instance to use in DateSlider
        return new AlternativeDateSlider(getActivity(),mDateSetListener,c,null,null);  // return DateSlider dialog to DialogFragment
    }
}

Надеюсь, это поможет прояснить ваше замешательство.

person Barak    schedule 13.06.2012
comment
Очень хочу ценить время, которое вы потратили! Одного я не понимаю, как getSupportFragmentManager() получает FragmentManager? Это в его коде? Наверное, я должен был это заметить. Я чувствую себя глупо, потому что нет. - person Andy; 13.06.2012
comment
Это ЯВЛЯЕТСЯ менеджером фрагментов (при использовании библиотеки поддержки). Было бы getFragmentManager, если бы вы не использовали библиотеку поддержки. Какую бы версию вы ни использовали, это вызов фреймворка для предоставления вам диспетчера фрагментов. - person Barak; 13.06.2012
comment
Сотрите это! Я нашел это. Класс активности. Я этого не предполагал. - person Andy; 13.06.2012
comment
Я не хочу вас беспокоить, но я пытался разобраться в коде, но, поскольку я никогда не использовал фрагменты, я действительно не знаю, как все это сочетается для работы с DatePickerDialog. Поскольку вы взглянули на код, не могли бы вы помочь мне выяснить, какие классы на самом деле напрямую работают с DatePicker, чтобы я мог сосредоточиться на этом. Я просто не знаю, что на самом деле с чем взаимодействует. Еще раз извините, если побеспокоил вас. - person Andy; 14.06.2012

Я знаю, что это мой вопрос, и на него уже есть ответ. Но я подумал, что добавлю свой собственный ответ другим, ищущим помощи по этому же вопросу. Я упростил приведенный выше пример кода до двух классов. Kbeal, любезно предоставивший руководство, проделал большую работу, но оно было слишком перегружено информацией, в которой даже не было необходимости. Поэтому, используя то, что я знал о диалогах и то, что я узнал из того, что я мог понять из учебника Kbeal, а также исследования, которые я провел с фрагментами, я предоставил свою реализацию из DatePickerDialog на моем GitHub.

https://github.com/Zeroe31890/DateDialogFragment

Все, что вам нужно сделать, это запустить его сразу после копирования и вставки двух классов, одного макета и изменения файла манифеста Android. Гораздо проще, чем любой другой учебник. О, и если кто-нибудь увидит что-то, что можно сделать лучше, пожалуйста, сделайте. Наслаждаться!

person Andy    schedule 16.06.2012
comment
Спасибо за помощь дружище :) - person Manoj Kumar; 05.02.2013
comment
Это было ближе к работе с поворотом экрана, чем любой другой пример, который я нашел (в большинстве случаев произошел сбой, а не просто не удалось обновить вызывающую активность со значением). За счет гибкости я смог заставить его работать для своих целей, передав идентификатор кнопки вместо обратного вызова и используя getActivity.findViewById() в onDateSet(), чтобы получить кнопку, чтобы я мог вызвать setText() - person Dan Is Fiddling By Firelight; 07.03.2013

Автор сообщения здесь: Похоже, вы все поняли. Я ответил на ваши вопросы в своем посте, прежде чем нашел это, хотя Барак отлично справляется с ответами на них. Если вы еще этого не сделали, загрузите полный исходный код примера приложения. Думаю, это поможет заполнить пробелы, которые у вас остались.

person kbeal    schedule 13.06.2012
comment
Так что у меня наконец-то появилась возможность взглянуть на него. Я понимаю, почему я запутался. И я определенно поправляюсь, но я никогда не использовал фрагменты, и то, как DatePicker сочетается с ним, теперь меня больше смущает, лол. Я буду продолжать впитывать и анализировать его, чтобы лучше понять его по мере того, как мне нужно его изучить, но если у вас есть возможность написать мне по электронной почте, которую я предоставил в вашем блоге, и помочь мне более тщательно, это было бы потрясающе. Если нет, то я полностью понимаю, и я благодарен за пост для начала, который очень помог. Хорошего дня. - person Andy; 14.06.2012