简体   繁体   中英

Showing Date/TIme with Date/Time Picker Android

I am attempting to set the Date/Time the user selects from a Lollipop Date/Time Picker. The issue I am having is the date/time will set to the Button Text no problem. The problem is that it won't save in the string that it is in. I then want to use that string for something I know how to do.

DATEPICKER CLASS

public class DatePickerFragment extends DialogFragment
        implements DatePickerDialog.OnDateSetListener {



    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // Use the current date as the default date in the picker

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

        // Create a new instance of DatePickerDialog and return it
        return new DatePickerDialog(getActivity(), this, year, month, day);
    }
    public void onDateSet(DatePicker view, int year, int month, int day) {

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


        Date d = new Date(year, month, day);
        SimpleDateFormat sdf = new SimpleDateFormat("EE, MMM dd, yyyy");
       // String newDate = sdf.format(d);
        Toast.makeText(getActivity(), mMonth, Toast.LENGTH_LONG).show();
        Toast.makeText(getActivity(), mDay, Toast.LENGTH_LONG).show();
        Toast.makeText(getActivity(), mYear, Toast.LENGTH_LONG).show();

    }


}

FRAGMENT CLASS

public class Request extends Fragment {




    public TextView mCurrentUser;

    public Button Request_Button;
    public Button RButton_Date;
    public Button RButton_Time;

    public String cug;
    public String cu;
    public String time;
    public String date;

    //Request newInstance()
    public static Request newInstance() {

        Request fragment = new Request();
        return fragment;

    }

    //Needed empty Request Constructor
    public Request() {
    }

    //Public onCreateView
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //Make a view
        View rootview = inflater.inflate(R.layout.fragment_request, container, false);

        //Where you would initialize your variables
        RButton_Date =(Button)rootview.findViewById(R.id.Request_Button_Date);
        RButton_Time =(Button)rootview.findViewById(R.id.Request_Button_Time);
        Request_Button = (Button)rootview.findViewById(R.id.Request_Button_Request);

        //Current User Logged In
        this.mCurrentUser = (TextView)rootview.findViewById(R.id.Current_User_TV);
        date = new SimpleDateFormat("EE, MMM dd, yyyy").format(new Date().getTime());
        time = new SimpleDateFormat("h:mm a" ).format(new Date().getTime());
        RButton_Time.setText(time);
        RButton_Date.setText(date);

        //Showing current user

        final ParseUser mCurrentUser = ParseUser.getCurrentUser();
        if(mCurrentUser == null){
            String mCurUserNull = "No User Logged on";
            this.mCurrentUser.setText(mCurUserNull);

        }
        else{
            cu = mCurrentUser.get("FirstName").toString();
            cug = String.format("Hi! %s do you need a technician today?", cu);
            this.mCurrentUser.setText(cug);

        }


        //=================================================================

        //Create Dialog
        RButton_Date.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //Do Stuff

                DialogFragment picker = new DatePickerFragment();
                picker.show(getFragmentManager(), "datePicker");


            }
        });
        DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

            }
        };

        RButton_Time.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                DialogFragment picker1 = new TimePickerFragment();
                picker1.show(getFragmentManager(), "timePicker");

            }
        });

                Request_Button.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        //Write Code for Gathering Variables and sending request email!!!
                        //Gather user info
                        //Populate email
                        //Send Username Request to Request@BitsNBytesStore.com
                        Toast.makeText(getActivity(), cu + " Requested a tech at "+time
                                +", on "+date, Toast.LENGTH_SHORT).show();
                    }
                });




        //return rootview
        return rootview;
    }

I don't understand what it is I am doing wrong. It produces error of Resources unknown. I have googled, searched Stackoverflow extensively. Everything from 2014 and older just doesn't work.

GOAL

I just want to get date/time selected by user to be used as a string that can be set to text inside a button. I am using the example code from Google .

EDIT

ONDATESET

public void onDateSet(DatePicker view, int year, int month, int day) {
        Button DateButton = (Button) getActivity().getWindow().getDecorView().getRootView().findViewById(R.id.Request_Button_Date);
        String stringDueDateFrag = (month+1) + "/" + day + "/" + year + " ";
        DateButton.setText(stringDueDateFrag);

        // Set up a Calendar object to capture the user selected date in case the user wants
        // edit the date later.  Put the user selected date in a Bundle for onCreateDialog function to use.



    }

ONTIMESET

public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        Button TimeButton = (Button) getActivity().getWindow().getDecorView().getRootView().findViewById(R.id.Request_Button_Date);
        String stringDueDateFrag = hourOfDay + ":" + minute;
        TimeButton.setText(stringDueDateFrag);
    }

LOG

11-08 15:07:39.229 4922-4966/com.megliosolutions.bitsnbytes W/EGL_emulation: eglSurfaceAttrib not implemented
11-08 15:07:39.229 4922-4966/com.megliosolutions.bitsnbytes W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xa5486920, error=EGL_SUCCESS
11-08 15:07:59.658 4922-4929/com.megliosolutions.bitsnbytes W/art: Suspending all threads took: 15.332ms
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime: FATAL EXCEPTION: main
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime: Process: com.megliosolutions.bitsnbytes, PID: 4922
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources$Theme android.content.Context.getTheme()' on a null object reference
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at android.app.DatePickerDialog.resolveDialogTheme(DatePickerDialog.java:88)
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at android.app.DatePickerDialog.<init>(DatePickerDialog.java:105)
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at android.app.DatePickerDialog.<init>(DatePickerDialog.java:82)
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at com.megliosolutions.bitsnbytes.Adapters.DatePickerFragment.onCreateDialog(DatePickerFragment.java:40)
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at android.support.v4.app.DialogFragment.getLayoutInflater(DialogFragment.java:308)
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:955)
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:740)
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1501)
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:458)
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5257)
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
11-08 15:08:04.618 4922-4922/com.megliosolutions.bitsnbytes E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
11-08 15:08:06.175 4922-4929/com.megliosolutions.bitsnbytes W/art: Suspending all threads took: 5.023ms

Try setting the targetFragment to the Request and implement the Callback in the Request Fragment. This way you can access the Date/Time in the calling Fragment itself.

In your DatePickerFragment, remove the OnDateSetListener and retrieve the Target fragment passed from the Request .

Here is a really good resource on Dialogs

public class DatePickerFragment extends DialogFragment {

    private DatePickerDialog.OnDateSetListener dateSetListener;

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

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        try {
            dateSetListener = (DatePickerDialog.OnDateSetListener) getTargetFragment();
        } catch (Exception e) {
            Log.i("~!@#$", e.getMessage());
        }

    }


    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
    // Use the current date as the default date in the picker
    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);

    // Create a new instance of DatePickerDialog and return it
    return new DatePickerDialog(getActivity(), dateSetListener, year, month, day);

    }

}

Now in your Request Fragment, call setTargetFragment .

public class Request extends Fragment implements OnDateSetListener {

    ...

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

    ...

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


        ...


        ...


        RButton_Date.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment picker = new DatePickerFragment();
                picker.setTargetFragment(MyFragmentDemo.this, 12345);
                picker.show(getFragmentManager(), "datePicker");
            }
        });

        ...

        return rootView;
    }


    // Override the onDateSet() callback here.
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        // get the Date and do as you require.
    }
}

WORKING SOLUTION

I have figured out how to get this working flawlessly.

You need to make sure you make a separate class for both Time/Datepickers. However, don't use "implements OnDateSetListener" instead just leave the class the way it is or remove that, and implement OnDateSetListener in the activity/fragment you want to use it in.

You can combine both in this way:

implements OnDateSetListener, OnTimeSetListener...

that will allow both to be used, but you must implement the needed methods. Then your good to go.

Make sure you initialize everything properly, and place everything where it needs to be programmatically.

You can try this out it's worked for me

    public class DatePickerFragment extends DialogFragment {

    private static final String ARG_DATE = "date";
    public static final String EXTRA_DATE =
            "com.bignerdranch.android.criminalintent.date";

    private DatePicker mDatePicker;

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        Date date = (Date)getArguments().getSerializable(ARG_DATE);

        Calendar calendar = Calendar.getInstance();

        calendar.setTime(date);

        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);

        View view = LayoutInflater.from(getActivity()).inflate(R.layout.dialog_date,null);

        mDatePicker = (DatePicker)view.findViewById(R.id.dialog_date_date_picker);
        mDatePicker.init(year,month,day,null);

        return new AlertDialog.Builder(getActivity())
                .setView(view)
                .setTitle(R.string.date_picker_title)
                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        int year = mDatePicker.getYear();
                        int month = mDatePicker.getMonth();
                        int day = mDatePicker.getDayOfMonth();
                        Date date = new GregorianCalendar(year, month, day).getTime();
                        sendResult(Activity.RESULT_OK, date);
                    }
                })
                .create();
    }

    public static DatePickerFragment newInstance(Date date){

        Bundle args = new Bundle();
        args.putSerializable(ARG_DATE,date);

        DatePickerFragment fragment = new DatePickerFragment();
        fragment.setArguments(args);
        return fragment;
    }

    private void sendResult(int resultCode,Date date){
        if (getTargetFragment() == null){
            return;
        }

        Intent intent = new Intent();
        intent.putExtra(EXTRA_DATE,date);

        getTargetFragment().onActivityResult(getTargetRequestCode(),resultCode,intent);

    }
}

and for calling in fragment

 mDateButton = (Button) view.findViewById(R.id.crime_date);
        updateDate((mCrime.getDate()).toString());
        /*mDateButton.setEnabled(false);*/
/* Design a date picker for an  application */
        mDateButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FragmentManager fragmentManager = getFragmentManager();
                /*DatePickerFragment dialog = new DatePickerFragment();*/

                DatePickerFragment dialog = DatePickerFragment.newInstance(mCrime.getDate());

                dialog.setTargetFragment(CrimeFragment.this, REQUEST_DATE);

                dialog.show(fragmentManager, DIALOG_DATE);
            }
        });

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM