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