Search code examples
androidandroid-fragmentsandroid-studioandroid-listfragmentandroid-datepicker

Problems with my ListFragment and DatePickerDialog


I'm new to Android development and have a problem in my ListFragment. I'm trying to start a DatePickerDialog with a button. The code in my ListFragment follows:

    @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);
    }

And here's my 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);
        }
    }

}

After clicking on the Button, the following error occured:

java.lang.ClassCastException: MainActivity cannot be cast to DatePickerFragment$TheListener

Inside a "standard" fragment the code is working.

After searching for a solution, I've tested some possibilities:

1.) instead of getSupportFragmentManager, usinggetFragmentManager --> "Cannot resolve method 'show(android.app.FragmentManager.java.lang.String)'

2.) instead of 'getActivity().getSupportFragmentManager()', using only 'getFragmentManager()' --> Also after clicking on the Button, the following error occured:

java.lang.ClassCastException: MainActivity cannot be cast to DatePickerFragment$TheListener

3.) I've tried to change my import import android.support.v4.app.ListFragment; to android.app.ListFragment; Also in my other two "standard" fragments I've changed the import to 'android.app.Fragment'

--> Here I'm getting problems with my MainActivity, because of this part:

        @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);
            }
        }

Obviously my MainActivity doesn't work with 'import android.app.Fragment;' and crashes.

I hope you can help me!


Solution

  • 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);
            }
        }
    
    }
    

    While you call DatepickerDialog:

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

    So you need to implement TheListener interface and will need to Override returnDate Method on That particular Class:

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