Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: AndyОтветов: 3

Итак, я был в этом какое-то время, и я не могу понять это. Я новичок в разработке 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, это также было бы чрезвычайно полезно. Я просто пытаюсь разобраться во всем этом, а не копировать и вставлять код (не то, чтобы он все равно работал). Большое спасибо, что нашли время, чтобы прочитать это, и если нужны какие-либо разъяснения, пожалуйста, спрашивайте.

androidandroid-fragmentsandroid-dialogfragmentandroid-datepicker

Ответы

Ответ 1 · рейтинг 4 · Barak

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

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

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

Ответ 2 · рейтинг 3 · Andy

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

https://github.com/Zeroe31890/DateDialogFragment

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

Ответ 3 · kbeal

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы