use setResult(RESULT_OK);
before finish()
method from second activity
from the second activity which you want should return some result to first activity
Question
I have an activity 1 which send intent to activity 2 as bellow:
activity 1
periodDatetv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent i = new Intent(Settings.this, SettingsPeriodDate.class);
startActivityForResult(i, 100);
}
});
activity 2
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
todayCalendar = new GregorianCalendar();
pickedDateCalendar = new GregorianCalendar();
final Dialog dialog = new Dialog(SettingsPeriodDate.this);
dialog.setContentView(R.layout.perioddatesettings);
datePicker = (DatePicker) dialog.findViewById(R.id.DataPickerDate);
dialog.show();
Button okDialogButton = (Button) dialog
.findViewById(R.id.dialogButtonOK);
// if button is clicked, close the custom dialog
okDialogButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Calendar c = Calendar.getInstance();
int currentYear = c.get(Calendar.YEAR);
int currentMonth = c.get(Calendar.MONTH) + 1;
int currentDay = c.get(Calendar.DAY_OF_MONTH);
Day = datePicker.getDayOfMonth();
Month = datePicker.getMonth() + 1;
Year = datePicker.getYear();
todayCalendar.set(currentYear, currentMonth, currentDay);
pickedDateCalendar.set(Year, Month, Day);
System.err.println("Choseon date = " + Day + "/" + Month + "/"
+ Year);
System.err.println("Today date = " + currentDay + "/"
+ currentMonth + "/" + currentYear);
int Days = daysBetween(todayCalendar.getTime(),
pickedDateCalendar.getTime());
System.err.println("Daaaaays === " + Days);
if (pickedDateCalendar.after(todayCalendar) || Days >= 1) {
System.err.println("Inside if pop it");
PopIt("Error ", "Please check the date again");
}
else {
periodDateSharedPreferences(Year, Month, Day);
}
dialog.dismiss();
System.err.println("befor back");
Intent saved2 = new Intent(SettingsPeriodDate.this,
Settings.class);
startActivityForResult(saved2, 100);
}
});
Button cancelDialogButton = (Button) dialog
.findViewById(R.id.dialogButtonCancel);
// if button is clicked, close the custom dialog
cancelDialogButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
dialog.dismiss();
Intent i = new Intent(SettingsPeriodDate.this,Settings.class);
startActivity(i);
}
});
}
public int daysBetween(Date d1, Date d2) {
return (int) ((d2.getTime() - d1.getTime()) / (1000 * 60 * 60 * 24));
}
public void periodDateSharedPreferences(int calculatedPeriodYear,
int calculatedPeriodMonth, int calculatedPeriodDay) {
SharedPreferences periodDatePreferences = PreferenceManager
.getDefaultSharedPreferences(this);
SharedPreferences.Editor editor = periodDatePreferences.edit();
editor.putInt("periodChosenDay", calculatedPeriodDay);
editor.putInt("periodChosenMonth", calculatedPeriodMonth);
editor.putInt("periodChosenYear", calculatedPeriodYear);
editor.commit();
System.err.println("periodChosenDay preferences"
+ periodDatePreferences.getInt("periodChosenDay", 0));
System.err.println("periodChosenMonth preferences"
+ periodDatePreferences.getInt("periodChosenMonth", 0));
System.err.println("periodChosenYear preferences"
+ periodDatePreferences.getInt("periodChosenYear", 0));
Toast.makeText(SettingsPeriodDate.this, "The date was saved",
Toast.LENGTH_LONG).show();
finish();
}
public void PopIt(String title, String message) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Error");
builder.setMessage("Please check again");
builder.setCancelable(true);
final AlertDialog dlg = builder.create();
dlg.show();
final Timer t = new Timer();
t.schedule(new TimerTask() {
public void run() {
dlg.dismiss();
t.cancel();
}
}, 100000);
}
and I get the result in activity 1 as bellow :
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case 100:
System.err.println("after intent back 111111=== ");
if (resultCode == Activity.RESULT_OK) {
System.err.println("after intent back if=== ");
int day = data.getIntExtra("Day", 0);
int month = data.getIntExtra("Month", 0);
int year = data.getIntExtra("Year", 0);
System.err.println("after intent back =///== " + day + "-" + month
+ "-" + year);
Toast.makeText(Settings.this,day+"?"+month+"?"+year,Toast.LENGTH_SHORT).show();
periodDatetv.setText(day + "/" + month + "/" + year);
break;
}
}
}
But it never runs the onActivityResult method ! what is the wrong in my code ? please tell me .. and thanks in advance
Solution
use setResult(RESULT_OK);
before finish()
method from second activity
from the second activity which you want should return some result to first activity
OTHER TIPS
You commented out your setResult()
call in activity 2.
In case you are starting your activity with startActivityForResult()
, the activity you start (activity 2 in your case) needs to call setResult()
each time it is about to be finished.
See this example:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.blablabla)
//we do this here to make sure result is set even if user leaves
//activity, for example, by pressing back/home buttons
//result we set here will be overridden by any latter calls if they occur
setResult(RESULT_CANCELED);
//do some processing here
Intent intent=new Intent();
//now let's send the result back
intent.putExtra(result);
setResult(RESULT_OK, intent);
finish();
}
private void another_method() {
//do some processing here too
Intent intent=new Intent();
//sending the result back
intent.putExtra(result);
//need to call setResult() here too
setResult(RESULT_OK, intent);
finish();
}
The issue here is you start SettingsPeriodDate
from Settings
and then Settings
from SettingsPeriodDate
.
You should not be starting Settings again. Just setResult()
and finish()
when your work with SettingsPeriodDate
is done
before finish activity to call setResult(RESULT_OK)
. I can't find it in your code. Instead of setting result you are call the activity one again. So it will create new activity. Don't call new activity with activity 1 intent.