Проблемы с моим ListFragment и DatePickerDialog

Я новичок в разработке для Android, и у меня возникла проблема в моем ListFragment. Я пытаюсь запустить DatePickerDialog с помощью кнопки. Код в моем ListFragment выглядит следующим образом:

    @Override
    public void onActivityCreated(final Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        b = (Button) getView().findViewById(R.id.button_set_date);
        et = (EditText) getView().findViewById(R.id.editText_choose_date);
        b.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                DialogFragment picker = new DatePickerFragment();
                picker.show(getActivity().getSupportFragmentManager(), "datePicker");
            }
        });



    @Override
    public void returnDate(String date) {
        et.setText(date);
    }

И вот мой DatePickerFragment:

public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

    TheListener listener;

    public interface TheListener {
        public void returnDate(String date);
    }

    @Override
    public Dialog onCreateDialog (Bundle savedInstanceState){
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);
        listener = (TheListener) getActivity();

        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    @Override
    public void onDateSet(DatePicker view, int year, int month, int day){
        Calendar c = Calendar.getInstance();
        c.set(year, month, day);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate = sdf.format(c.getTime());
        if (listener != null){
            listener.returnDate(formattedDate);
        }
    }

}

После нажатия на кнопку возникла следующая ошибка:

java.lang.ClassCastException: MainActivity нельзя преобразовать в DatePickerFragment$TheListener

Внутри "стандартного" фрагмента код работает.

После поиска решения я проверил некоторые возможности:

1.) вместо getSupportFragmentManager, usinggetFragmentManager --> «Не удается разрешить метод 'show (android.app.FragmentManager.java.lang.String)'

2.) вместо 'getActivity().getSupportFragmentManager()', используя только 'getFragmentManager()' --> Также после нажатия на кнопку произошла следующая ошибка:

java.lang.ClassCastException: MainActivity нельзя преобразовать в DatePickerFragment$TheListener

3.) Я попытался изменить свой импорт import android.support.v4.app.ListFragment; на android.app.ListFragment; Также в двух других моих «стандартных» фрагментах я изменил импорт на «android.app.Fragment».

--> Здесь у меня возникают проблемы с моей MainActivity из-за этой части:

        @Override
        public Fragment getItem(int position) {
            // getItem is called to instantiate the fragment for the given page.
            // Return a PlaceholderFragment (defined as a static inner class below).

            switch (position){
                case 0: return TestListFragment.newInstance("a", "b");
                case 1: return TestFragment.newInstance("a","b");
                case 2: return TestFragment2.newInstance("a", "b");
                default: return PlaceholderFragment.newInstance(position + 1);
            }
        }

Очевидно, что моя MainActivity не работает с import android.app.Fragment; и сбои.

Я надеюсь, что вы можете помочь мне!


person Sarah_1999    schedule 04.05.2015    source источник


Ответы (2)


public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

    TheListener listener = null;

    public interface TheListener {
        public void returnDate(String date);
    }

    public void onDateSetListener(TheListener listener){
        this.listener = listener;
    }

    @Override
    public Dialog onCreateDialog (Bundle savedInstanceState){
        final Calendar c = Calendar.getInstance();
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);

        return new DatePickerDialog(getActivity(), this, year, month, day);
    }

    @Override
    public void onDateSet(DatePicker view, int year, int month, int day){
        Calendar c = Calendar.getInstance();
        c.set(year, month, day);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String formattedDate = sdf.format(c.getTime());
        if (listener != null){
            listener.returnDate(formattedDate);
        }
    }

}

Пока вы вызываете DatepickerDialog:

 DatePickerFragment picker = new DatePickerFragment();
 picker.onDateSetListener(this);
 picker.show(getActivity().getSupportFragmentManager(), "datePicker");

Итак, вам нужно реализовать интерфейс TheListener и переопределить метод returnDate для этого конкретного класса:

@Override
public void returnDate(String date) {
    et.setText(date);
}
person Dhaval Patel    schedule 04.05.2015
comment
Большое спасибо! Я редактирую свой DatePickerFragment, а также свой ListFragment. Здесь я реализую прослушиватель: открытый классTestListFragment расширяет ListFragment, реализует DatePickerFragment.TheListener Но выбор строки.onDateSetListener(это) создает проблемы. - person Sarah_1999; 04.05.2015
comment
Я думаю, вам нужно использовать picker.onDateSetListener(TestListFragment.this); - person Dhaval Patel; 04.05.2015
comment
Ух ты!! Есть DatePickerDialog, и я могу выбрать дату! Спасибо, Дхавал Патель!! :-) Я не вижу выбранную дату в своем EditTextField, но это нормально! Буду искать проблему в коде. :) - person Sarah_1999; 04.05.2015
comment
Рад помочь вам :-) - person Dhaval Patel; 04.05.2015

Похоже, что родитель Activity вашего ListFragment не реализует TheListener.

Когда вы звоните

listener = (TheListener) getActivity();

вы переводите родительскую активность ListFragment в TheListener.

Кстати, вы должны быть осторожны с этим. Если вы повернете экран, Activity будет воссоздан, а ваш DatePickerFragment будет отсоединен, а новый будет присоединен. Старый метод getActivity вернет null.

Вы должны проверить метод onCreate(View) вашего ListFragment, чтобы увидеть, существует ли уже экземпляр DatePickerFragment (поищите его по тегу), и, если да, вы можете повторно отобразить и повторно подключить слушателей этого фрагмента к вашему новому деятельность вместо создания новой.

person David Whitman    schedule 04.05.2015
comment
Спасибо за ваше объяснение! В моем onCreate(View) нет экземпляра DatePickerFragment. Но я постараюсь изменить его. :-) - person Sarah_1999; 04.05.2015