Search code examples
javaandroiddialogfragment

Passing Back Data from a DialogFragment to Its Calling Activity?


My goal is to pass a String from a DialogFragment to its calling Activity. If I understand correctly, I think there exists a need to implement an interface inside the calling Activity. I think the purpose includes creating a "listener" method.

When placed in the class extending DialogFragment, "getActivity()" does not seem to reach the calling Activity. It does not seem to recognize any of the custom methods I add.

How should I approach this? Thank you for your time.

Edit 01: Maybe I am blind to something, but I am not understanding why the "getActivity()" method in the DialogFragment-extended class is referencing the wrong object. Thanks again.

MainActivity.java :

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;


public class MainActivity extends AppCompatActivity {       //implements Something

    String dateThing;
    EditText date_EditText;
    DatePickerFragment newFragment;


    @Override
    protected void onCreate( Bundle savedInstanceState ) {

        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );

        dateThing = "Change This";

        //This just changes the title of the ToolBar.
        getSupportActionBar().setTitle( "Date Changing Test" );

        date_EditText = findViewById( R.id.dateXML );
        date_EditText.setText( dateThing );

    }


    public void showDatePicker_Thing( View v ) {

        newFragment = new DatePickerFragment();
        newFragment.show( getFragmentManager(), "date picker" );

    }


    public void setDate_in_EditText( String date_for_Setting_the_EditText ) {

        date_EditText.setText( date_for_Setting_the_EditText );

    }

}

DatePickerFragment.java :

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.os.Bundle;
import android.widget.DatePicker;
import android.widget.Toast;

import java.sql.Date;
import java.util.Calendar;


public class DatePickerFragment extends DialogFragment {

    Date testDate;


    @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(), dateSetting_Listener, year, month, day );

    }


    private DatePickerDialog.OnDateSetListener dateSetting_Listener =
            new DatePickerDialog.OnDateSetListener() {

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

            testDate = Date.valueOf( view.getYear() + "-" + ( view.getMonth() +1 ) + "-"
                    + view.getDayOfMonth() );

            Toast.makeText( getActivity(), "The selected date:  " + testDate.toString(),
                    Toast.LENGTH_LONG ).show();

            Activity activityTest = getActivity();


            //************************************************************************
            //TODO  "setDate_in_EditText()" NOT FOUND AS A METHOD FROM "MainActivity".
            //getActivity().setDate_in_EditText( "test" );
            getActivity();
            //************************************************************************

        }
    };

}

activity_main.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"

    android:orientation="vertical"
    android:scrollbarAlwaysDrawVerticalTrack="true"
    android:scrollbars="vertical"
    android:showDividers="none"

    tools:context="com.moocow.datepickerfragment_test.MainActivity"
    >


    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="\nAdjustments Stuff"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textStyle="bold"
        />


    <EditText
        android:id="@+id/dateXML"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:onClick="showDatePicker_Thing"
        />

</LinearLayout>

Solution

  • You need to cast getActivity() to MainActivity then only you access setDate_in_EditText() method

    ((MainActivity)getActivity()).setDate_in_EditText("test");