Kyle Yeo
Kyle Yeo

Reputation: 2368

Android returning and displaying DatePicker from DialogFragment class

I'm a bit new to Android Programming, so bear with me here...

I'm following the tutorial from Google Android - Pickers, but after following through, I have no idea how to return and display the selected date on the original activity.

If that sounds very confusing now, I currently have 2 classes - ClassA.java and ClassB.java, where ClassA is my main activity, and ClassB is my dialog fragment.

I understand that this function below (this is in ClassB) takes in the view, year, month and text and returns something, but I have no idea how to store it back in the main function in ClassA and display it as the currently selected value in the Spinner (TextView).

public void onDateSet(DatePicker view, int year, int month, int day) {
    // Do something with the date chosen by the user
    return [something];
}

My function in ClassA uses the code below once the user taps (onClick) on the Spinner (TextView) :

public void DatePicker(View v) {
    DialogFragment DateFragment = new NotifyDatePicker();
    DateFragment.show(getSupportFragmentManager(), "DatePicker");
}

So the question is, where do I start storing the data? Do I grab the return from ClassB to ClassA (is there even a returned value?) and store it into a Bundle (while also at the same time updating the R.id.TextViewSpinner), or do I save it while the user is inside the DialogFragment (ClassB)?

EDIT

I just realized my mistake. ClassB is a separate activity on its own, so changing of the Spinner (TextView) and storing of the Bundle should be done in ClassB...

There's one small problem though.

I'm using (TextView)findViewById(R.id.TextViewSpinner).setText(daymonthyear) but an error keeps coming up :

The method findViewById(int) is undefined for the type ClassB

Is there something I've forgotten to import/include?

FULL CODES

public class ClassB 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) {

        // Change TextViewSpinner here (setText)

        // Tried (TextView)findViewById(R.id.TextViewSpinner).setText(daymonthyear) - The method findViewById(int) is undefined for the type ClassB error returned

        // Tried (TextView)context.findViewById(R.id.TextViewSpinner) - context cannot be resolved error returned

        return;
    }
}

This is via the Google Tutorial. I've been tweaking here and there but it always throws me back to square one...

Upvotes: 1

Views: 2463

Answers (2)

steps
steps

Reputation: 638

There is actually no need to take the detour via the shared preferences. All you have to do is tell your ClassB where to look for the view:

public void onDateSet(DatePicker view, int year, int month, int day) {

    // Change TextViewSpinner here (setText)

    // Tried (TextView)findViewById(R.id.TextViewSpinner).setText(daymonthyear)
    // - The method findViewById(int) is undefined for the type ClassB error returned

    // Instead try:
    (TextView) getActivity().findViewById(R.id.TextViewSpinner)
        .setText(day + "/" + month + "/" + year)

    // Tried (TextView)context.findViewById(R.id.TextViewSpinner)
    // - context cannot be resolved error returned

    return;
}

For the full code of the class extending DialogFragment (in your case ClassB) see this answer of mine to a similar question.

Upvotes: 1

MarchingHome
MarchingHome

Reputation: 1204

Maybe not the best solution, but you can use the DefaultSharedPreferences to save the values:

public void onDateSet(DatePicker view, int year, int month, int day) {

    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    preferences.putInt("year", year);
    preferences.putInt("month", month);
    preferences.putInt("day", day;
    preferences.commit();

    return;
}

and do something with them in Activity A:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
int year = preferences.getInt("year", 0);
int month = preferences.getInt("month", 0);
int day = preferences.getInt("day", 0);

(TextView)findViewById(R.id.TextViewSpinner).setText(day + "/" + month + "/" + year);    

I hope this helps.

It is by the way recommended to have references like TextViewSpinner start with a non-capital letter: textViewSpinner.

Upvotes: 1

Related Questions