onActivityResult无法正常工作

时间:2013-01-16 08:11:55

标签: java android android-intent start-activity

我有一个活动1,它将意图发送到活动2,如下所示:

活动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);
            }
        });

活动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);
    }

我在 活动1 中得到的结果如下:

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;

         }

        }
    }

但它永远不会运行onActivityResult方法!我的代码有什么问题?请告诉我..并提前谢谢

4 个答案:

答案 0 :(得分:2)

在第二项活动的setResult(RESULT_OK);方法之前使用finish()

从您想要的第二个活动应该将一些结果返回到第一个活动

答案 1 :(得分:2)

您在活动2中注释了setResult()来电。

如果您使用startActivityForResult()开始活动,则您开始的活动(在您的情况下为活动2)每次即将完成时都需要致电setResult()

见这个例子:

@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();
}

答案 2 :(得分:1)

此处的问题是,您从SettingsPeriodDate开始Settings,然后从Settings开始SettingsPeriodDate

您不应该再次启动“设置”。完成setResult()的工作后,只需finish()SettingsPeriodDate

答案 3 :(得分:0)

在完成活动之前

致电setResult(RESULT_OK)。我在你的代码中找不到它。而不是设置结果,您再次调用活动。所以它会创造新的活动。不要使用活动1意图调用新活动。