-1

I want to show date picker dialog inside a android fragment. I have found some examples but i am not getting it properly. I have two edit text (called R.id.event_start_time_a & R.id.event_end_time_a) and when i click on it, the date picker dialog should popup and after setting the date, the date should shown in edit text in dd/mm/yyyy format. Please, any help would be very appreciated.

Complete code.

Edited: Add Event fragment :

public class AddEventFragment extends Fragment {

private static final String TAG = "AddEventFragment";
public final Calendar myCalendar = Calendar.getInstance();
private FirebaseFirestore firestoreDB;
private boolean isEdit;

private String docId;

public AddEventFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.add_event, container, false);

    Button button = (Button) view.findViewById(R.id.add_event);

    Event event = null;
    if(getArguments() != null){
        event = getArguments().getParcelable("event");
        ((TextView)view.findViewById(R.id.add_tv)).setText("Edit Event");
    }
    if(event != null){
        ((TextView) view.findViewById(R.id.event_name_a)).setText(event.getName());
        ((TextView) view.findViewById(R.id.event_type_a)).setText(event.getType());
        ((TextView) view.findViewById(R.id.event_place_a)).setText(event.getPlace());

        final EditText startTime = (EditText)view.findViewById(R.id.event_start_time_a);
        startTime.setText(event.getStartTime());
        startTime.setFocusable(false);
        startTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showDatePickerDialog();
                SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy");
                startTime.setText(sdf.format(myCalendar.getTime()));
            }
        });

        final EditText endTime = (EditText)view.findViewById(R.id.event_end_time_a);
        endTime.setText(event.getEndTime());
        endTime.setFocusable(false);
        endTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showDatePickerDialog();
                SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy");
                endTime.setText(sdf.format(myCalendar.getTime()));
            }
        });

        button.setText("Edit Event");
        isEdit = true;
        docId = event.getId();
    }

    firestoreDB = FirebaseFirestore.getInstance();

    button.setOnClickListener(new View.OnClickListener()        {
        @Override
        public void onClick(View v)
        {
            if(!isEdit){
                addEvent();
            }else {
                updateEvent();
            }
        }
    });
    return view;
}

final DatePickerDialog.OnDateSetListener mdate = new DatePickerDialog.OnDateSetListener(){
    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        myCalendar.set(Calendar.YEAR, year);
        myCalendar.set(Calendar.MONTH, month);
        myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
    }
};

public void showDatePickerDialog(){
    DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), mdate, myCalendar.get(Calendar.YEAR), myCalendar.get(Calendar.MONTH), myCalendar.get(Calendar.DAY_OF_MONTH));
    datePickerDialog.show();
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
}

public void addEvent(){
    Event event = createEventObj();
    addDocumentToCollection(event);
}
public void updateEvent(){
    Event event = createEventObj();
    updateDocumentToCollection(event);
}
private Event createEventObj(){
    final Event event = new Event();
    event.setName(((TextView)getActivity().findViewById(R.id.event_name_a)).getText().toString());
    event.setPlace(((TextView)getActivity().findViewById(R.id.event_place_a)).getText().toString());
    event.setType(((TextView)getActivity().findViewById(R.id.event_type_a)).getText().toString());
    final EditText startTime1 = (EditText)getActivity().findViewById(R.id.event_start_time_a);
    startTime1.setText(event.getStartTime());
    startTime1.setFocusable(false);
    startTime1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showDatePickerDialog();
            SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy");
            startTime1.setText(sdf.format(myCalendar.getTime()));
        }
    });

    final EditText endTime1 = (EditText)getActivity().findViewById(R.id.event_start_time_a);
    endTime1.setText(event.getEndTime());
    endTime1.setFocusable(false);
    endTime1.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showDatePickerDialog();
            SimpleDateFormat sdf = new SimpleDateFormat("dd MMMM yyyy");
            endTime1.setText(sdf.format(myCalendar.getTime()));
        }
    });

    //event.setStartTime(((TextView)getActivity().findViewById(R.id.event_start_time_a)).getText().toString());
    //event.setEndTime(((TextView)getActivity().findViewById(R.id.event_end_time_a)).getText().toString());

    return event;
}
private void addDocumentToCollection(Event event){
    firestoreDB.collection("events")
            .add(event)
            .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                @Override
                public void onSuccess(DocumentReference documentReference) {
                    Log.d(TAG, "Event document added - id: " + documentReference.getId());
                    restUi();
                    Toast.makeText(getActivity(), "Event document has been added", Toast.LENGTH_SHORT).show();
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.w(TAG, "Error adding event document", e);
                    Toast.makeText(getActivity(), "Event document could not be added", Toast.LENGTH_SHORT).show();
                }
            });
}
private void updateDocumentToCollection(Event event){
    firestoreDB.collection("events")
            .document(docId)
            .set(event, SetOptions.merge())
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Log.d(TAG, "Event document updated ");
                    Toast.makeText(getActivity(),"Event document has been updated", Toast.LENGTH_SHORT).show();
                    showEventScreen();
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.w(TAG, "Error adding event document", e);
                    Toast.makeText(getActivity(), "Event document could not be added", Toast.LENGTH_SHORT).show();
                }
            });
}
private void restUi(){
    ((TextView)getActivity().findViewById(R.id.event_name_a)).setText("");
    ((TextView)getActivity().findViewById(R.id.event_type_a)).setText("");
    ((TextView)getActivity().findViewById(R.id.event_place_a)).setText("");
    ((TextView)getActivity().findViewById(R.id.event_start_time_a)).setText("");
    ((TextView)getActivity().findViewById(R.id.event_end_time_a)).setText("");
}
private void showEventScreen() {
    Intent i = new Intent();
    i.setClass(getActivity(), EventActivity.class);
    startActivity(i);
}

}

Hendy
  • 265
  • 1
  • 6
  • 27

2 Answers2

2

You are not calling showDatePickerDialog() anywhere. You need to add onClickListener() to your textview and then call it there:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {                    

        //...
        EditText startTime = view.findViewById(R.id.event_start_time_a));
        startTime.setText(event.getStartTime());
        startTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showDatePickerDialog();
            }
        });
        EditText endTime = view.findViewById(R.id.event_end_time_a));
        endTime.setText(event.getEndTime());
        endTime.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                showDatePickerDialog();
            }
        });
        //...
    }
}
Siim Puniste
  • 210
  • 2
  • 11
  • Hi, I already edited the fragment (as shown above), but when i clicked edit text, it still now showing up the date picker dialog. I put the full code and hope you can help – Hendy Aug 02 '18 at 08:29
  • Just to be clear - when you say "edittext" you mean TextView, not and EditText, right? Because EditText is a whole other view that you are currently not using in your code. Also, does it reach showDatePickerDialog()? You can check it with breakpoint or logging. – Siim Puniste Aug 02 '18 at 08:43
  • I just put add_event.xml. I'm using android.support.design.widget.TextInputLayout, and then inside it, i put edit text. as shown above. – Hendy Aug 02 '18 at 08:52
  • Those are EditTexts, so i think you should cast them as EditText in the code. Check if that helps. I will edit my answer as well. – Siim Puniste Aug 02 '18 at 09:17
  • Hi @Siim Puniste Sorry for late respond, I just edit the fragment inside OnCreateView and basically already follow your codes. however, the DatePicker Dialog showed on Edit section only (Inside OnCreateView). I do believe the Add section that I need to show also the DatePicker dialog is in createEventObj() methods. When I tried to implement your codes, it's still not showing the date picker dialog (only edit text). I hope you understand what I mean – Hendy Aug 03 '18 at 04:58
  • What I really want to say is, there are 2 section in here. there are Add section (which is still not showing the date picker dialog), and View section (already shown the date picker dialog). so, my concern now is in createEventObj() method. – Hendy Aug 03 '18 at 05:01
  • You have the same casting problem in createEventObj() method. Those are EditText views, not TextViews. But i'm actually not understanding still: when you press on startTime EditText view in your app, does it show DatePicker dialog? – Siim Puniste Aug 03 '18 at 09:41
  • Hi @Siim Puniste I just edit my codes above. as you can see, it's already shown datepicker dialog in View Section under OnCreateView method. the other obstacle is in createEventObj() method. I already try to implement your code in that method but when i click the edit text, there are still nothing happen. – Hendy Aug 03 '18 at 10:00
  • Hi @Siim Puniste Please see my codes above in createEventObj method above. – Hendy Aug 03 '18 at 10:10
  • Where are you calling this method? Is this in a new fragment? Connecting views and adding click listeners should be done in fragments onCreateView() method. I don't understand what are you trying to do with this createEventObj() method – Siim Puniste Aug 03 '18 at 11:02
  • Hi @Siim Puniste, I called createEventObj() method in the same fragment. I load the complete code above for your review. basically, inside onCreateView, there are button that will call addEvent() method. inside addEvent() method, there are function that will call onCreateEventObj() method that located outside onCreateView. now my problem, how to casting properly using your codes because until right now the date picker dialog not show on createEventObj – Hendy Aug 04 '18 at 05:07
0
int mYear, mMonth, mDay;
Calendar c;

private void show_Datepicker() {

    c = Calendar.getInstance();
    mYear = c.get(Calendar.YEAR);
    mMonth = c.get(Calendar.MONTH);
    mDay = c.get(Calendar.DAY_OF_MONTH);


    DatePickerDialog datePickerDialog = new DatePickerDialog(context,
            new DatePickerDialog.OnDateSetListener() {

                @Override
                public void onDateSet(DatePicker view, int year,
                                      int monthOfYear, int dayOfMonth) {


                    int month = monthOfYear + 1; // month count given less one e.g. august then give month no 7

                    String dayStr   = String.valueOf(dayOfMonth);
                    String monthStr = String.valueOf(month);

                    if (dayStr.length() == 1)
                        dayStr = "0"+dayStr;

                    if (monthStr.length() == 1)
                        monthStr = "0"+monthStr;

                    // dd/mm/yyyy format set.
                    your_edit_text.setText(dayStr+"/"+monthStr+"/"+year);


                }

            }, mYear, mMonth, mDay);
    datePickerDialog.show();
}
Vishnu Saini
  • 129
  • 5