T.Nice T.Nice - 15 days ago 6
Android Question

Passing argument from a fragment to its container activity

I have two

fragments
with
time
and
date picker
.
I need to send data chosen by the user from the fragment and pass them to to
fragments activity
, in order to combine data and send it to another
activity
.
I used this solution Link but data is
null
.

This is
FragmentOne
-
FramentTwo
is the same

public FragmentOne(){}

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

//FROM SIDE
timeButtonFrom = (Button)view.findViewById(R.id.time_button);
dateButtonFrom = (Button)view.findViewById(R.id.date_button);
tvDateFrom = (TextView)view.findViewById(R.id.time_textview);
tvTimeFrom = (TextView)view.findViewById(R.id.date_textview);


timeButtonFrom.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Calendar now = Calendar.getInstance();
// TimePickerDialog tpd = TimePickerDialog.newInstance(
TimePickerDialog tpd = TimePickerDialog.newInstance(
FragmentOne.this,
now.get(Calendar.HOUR_OF_DAY),
now.get(Calendar.MINUTE),true);//24H Enable, If 12 set false
tpd.setThemeDark(true);
tpd.enableMinutes(true);
tpd.setTitle("Choose Time");
tpd.setTimeInterval(1,15);//setTimeInterval to 1H and 15Min


tpd.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialogInterface) {
Log.d("TimePicker", "Dialog was cancelled");
}
});

tpd.show(getFragmentManager(), "ChooseTimeFrom");
}
});// end Button Listener FROM

dateButtonFrom.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Calendar now = Calendar.getInstance();
DatePickerDialog dpd = DatePickerDialog.newInstance(
FragmentOne.this,
now.get(Calendar.YEAR),
now.get(Calendar.MONTH),
now.get(Calendar.DAY_OF_MONTH)
);
dpd.setThemeDark(true);
dpd.showYearPickerFirst(true);
dpd.setTitle("Choose Date");
dpd.show(getFragmentManager(), "ChooseDateFrom");
}
});//END DATEBUTTONFROM
return view;

}//END ONCREATEVIEW

@Override
public void onResume() {
super.onResume();
DatePickerDialog dpd = (DatePickerDialog) getFragmentManager().findFragmentByTag("ChooseDateFrom");
if(dpd != null) dpd.setOnDateSetListener(this);
TimePickerDialog tpd = (TimePickerDialog) getFragmentManager().findFragmentByTag("ChooseTimeFrom");
if(tpd != null) tpd.setOnTimeSetListener(this);

}



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

String date = "You picked the following date: "+year+"/"+(++monthOfYear)+"/"+dayOfMonth;
tvDateFrom.setText(date);

}

@Override
public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute, int second) {

String hourString = hourOfDay < 10 ? "0"+hourOfDay : ""+hourOfDay;
String minuteString = minute < 10 ? "0"+minute : ""+minute;
String secondString = second < 10 ? "0"+second : ""+second;
String time = "You picked the following time: "+hourString+"h"+minuteString+"m"+secondString+"s";
tvTimeFrom.setText(time);
}


This is my Activity

public class DatePickerActivity extends AppCompatActivity {
private static final String TAG = "DatePickerActivity";
ViewPager viewPager;
PickerAdapter adapter;
String myString = "TEST";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.date_fragment);
String strObj = getIntent().getStringExtra("Location");
GetParamsClass getParamsClass = new Gson().fromJson(strObj,GetParamsClass.class);

adapter = new PickerAdapter(getFragmentManager());
viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setAdapter(adapter);

setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
for(int i=0;i<adapter.getCount();i++) tabLayout.getTabAt(i).setText(adapter.getTitle(i));



}

public String getMyData() {
return myString;
}

class PickerAdapter extends android.support.v13.app.FragmentPagerAdapter {
private static final int NUM_PAGES = 2;
Fragment fragmentOne;
Fragment fragmentTwo;

public PickerAdapter(FragmentManager fm) {
super(fm);
fragmentOne = new FragmentOne();
fragmentTwo = new FragmentTwo();
}

@Override
public int getCount() {
return NUM_PAGES;
}

@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return fragmentOne;
case 1:
default:
return fragmentTwo;
}
}

public int getTitle(int position) {
switch(position) {
case 0:
return R.string.tab_title_time;
case 1:
default:
return R.string.tab_title_date;
}
}
}
}


EDIT

public class DatePickerActivity extends AppCompatActivity implements FragmentOne.OnDateTimeSelectedListener {
private static final String TAG = "DatePickerActivity";
ViewPager viewPager;
PickerAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.date_fragment);

adapter = new PickerAdapter(getFragmentManager(),this);
viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setAdapter(adapter);

setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
for(int i=0;i<adapter.getCount();i++) tabLayout.getTabAt(i).setText(adapter.getTitle(i));
}

@Override
public void onDateTimeSelected(String date) {
Log.d(TAG, "onDateTimeSelected: "+ date);
}

class PickerAdapter extends android.support.v13.app.FragmentPagerAdapter {
private static final int NUM_PAGES = 2;
Fragment fragmentOne;
Fragment fragmentTwo;

public PickerAdapter(FragmentManager fm,DatePickerActivity activity) {
super(fm);
fragmentOne = new FragmentOne();
fragmentTwo = new FragmentTwo();
fragmentOne.setOnDateTimeSelectedListener(activity);//THIS LINE GIVES ERROR

}

@Override
public int getCount() {
return NUM_PAGES;
}

@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return fragmentOne;
case 1:
default:
return fragmentTwo;
}
}

public int getTitle(int position) {
switch(position) {
case 0:
return R.string.tab_title_time;
case 1:
default:
return R.string.tab_title_date;
}
}
}


Fragment One

public class FragmentOne extends DialogFragment implements DatePickerDialog.OnDateSetListener,TimePickerDialog.OnTimeSetListener {

Button timeButtonFrom ;
Button dateButtonFrom;
TextView tvDateFrom ;
TextView tvTimeFrom ;


public interface OnDateTimeSelectedListener{
void onDateTimeSelected(String date);
}



private OnDateTimeSelectedListener onDateTimeSelectedListener;

public void setOnDateTimeSelectedListener(OnDateTimeSelectedListener onDateTimeSelectedListener){
this.onDateTimeSelectedListener = onDateTimeSelectedListener;
}

public OnDateTimeSelectedListener getOnDateTimeSelectedListener(){
return onDateTimeSelectedListener;
}




public FragmentOne(){}

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

//FROM SIDE
timeButtonFrom = (Button)view.findViewById(R.id.time_button);
dateButtonFrom = (Button)view.findViewById(R.id.date_button);
tvDateFrom = (TextView)view.findViewById(R.id.time_textview);
tvTimeFrom = (TextView)view.findViewById(R.id.date_textview);



timeButtonFrom.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Calendar now = Calendar.getInstance();
// TimePickerDialog tpd = TimePickerDialog.newInstance(
TimePickerDialog tpd = TimePickerDialog.newInstance(
FragmentOne.this,
now.get(Calendar.HOUR_OF_DAY),
now.get(Calendar.MINUTE),true);//24H Enable, If 12 set false
tpd.setThemeDark(true);
tpd.enableMinutes(true);
tpd.setTitle("Choose Time");
tpd.setTimeInterval(1,15);//setTimeInterval to 1H and 15Min


tpd.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialogInterface) {
Log.d("TimePicker", "Dialog was cancelled");
}
});

tpd.show(getFragmentManager(), "ChooseTimeFrom");
}
});// end Button Listener FROM

dateButtonFrom.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Calendar now = Calendar.getInstance();
DatePickerDialog dpd = DatePickerDialog.newInstance(
FragmentOne.this,
now.get(Calendar.YEAR),
now.get(Calendar.MONTH),
now.get(Calendar.DAY_OF_MONTH)
);
dpd.setThemeDark(true);
dpd.showYearPickerFirst(true);
dpd.setTitle("Choose Date");
dpd.show(getFragmentManager(), "ChooseDateFrom");
}
});//END DATEBUTTONFROM




return view;

}//END ONCREATEVIEW

@Override
public void onResume() {
super.onResume();
DatePickerDialog dpd = (DatePickerDialog) getFragmentManager().findFragmentByTag("ChooseDateFrom");
if(dpd != null) dpd.setOnDateSetListener(this);
TimePickerDialog tpd = (TimePickerDialog) getFragmentManager().findFragmentByTag("ChooseTimeFrom");
if(tpd != null) tpd.setOnTimeSetListener(this);

}



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

String date = "You picked the following date: "+year+"/"+(++monthOfYear)+"/"+dayOfMonth;
tvDateFrom.setText(date);

if(tvTimeFrom != null && tvTimeFrom.getText() != null && !tvTimeFrom.getText().toString().equals("")){

String dateTimeString = date + tvTimeFrom.getText().toString();
onDateTimeSelectedListener.onDateTimeSelected(dateTimeString);
}


}

@Override
public void onTimeSet(RadialPickerLayout view, int hourOfDay, int minute, int second) {

String hourString = hourOfDay < 10 ? "0"+hourOfDay : ""+hourOfDay;
String minuteString = minute < 10 ? "0"+minute : ""+minute;
String secondString = second < 10 ? "0"+second : ""+second;
String time = "You picked the following time: "+hourString+"h"+minuteString+"m"+secondString+"s";
tvTimeFrom.setText(time);

if(tvDateFrom != null && tvDateFrom.getText() != null && !tvDateFrom.getText().toString().equals("")){

String dateTimeString = tvDateFrom.getText().toString() + time;
onDateTimeSelectedListener.onDateTimeSelected(dateTimeString);
}




}
}//END FRAGMENT CLASS

Answer

Try this, In FragmentOne Create an interface say

public interface OnDateTimeSelectedListener{
    void onDateTimeSelected(String date, S)
}



private OnDateTimeSelectedListener onDateTimeSelectedListener;

public void setOnDateTimeSelectedListener(OnDateTimeSelectedListener onDateTimeSelectedListener){
        this.onDateTimeSelectedListener = onDateTimeSelectedListener;
}

public OnDateTimeSelectedListener getOnDateTimeSelectedListener(){
        return onDateTimeSelectedListener;
}

In onDateSet(...) method check is time already selected if yes then call the callback

if(tvTimeFrom != null && tvTimeFrom.getText() != null && !tvTimeFrom.getText().toString().trim.equals("")){

    String dateTimeString = date + tvTimeFrom.getText().toString();
    onDateTimeSelectedListener.onDateTimeSelected(dateTimeString);
}

In onTimeSet method check is time already selected if yes then call the callback

if(tvDateFrom != null && tvDateFrom.getText() != null && !tvDateFrom.getText().toString().trim.equals("")){

    String dateTimeString = tvDateFrom.getText().toString() + time;
    onDateTimeSelectedListener.onDateTimeSelected(dateTimeString);
}

In DatePickerActivity

Update this line:

public class DatePickerActivity extends AppCompatActivity implements FragmentOne.OnDateTimeSelectedListener{


 // update inside

UPDATE:

   adapter = new PickerAdapter(getFragmentManager(), this);
  ....     

and In

public PickerAdapter(FragmentManager fm) 

constructor update the constructor and try to set the listener

UPDATE

public PickerAdapter(FragmentManager fm, DatePickerActivity activity) {
        super(fm);
        fragmentOne = new FragmentOne();
        fragmentTwo = new FragmentTwo();
fragmentOne.setOnDateTimeSelectedListener(activity);
    }

And override

void onDateTimeSelected(String datetimeString){
    //You will get DatetimeString here
    //use it

}

UPDATE

Remove that line which was giving error and add these 2 methods and try

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
          onDateTimeSelectedListener = (OnDateTimeSelectedListener) activity;

    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnHeadlineSelectedListener");
    }

}

@Override
public void onDetach(){
super.onDetach();    
onDateTimeSelectedListener = null

}

Reference :Communicating with Other Fragments