2013-01-16 38 views
0

我有一個活動1,它發送意圖活動2波紋管:onActivityResult工作不正常

活動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方法!我的代碼中有什麼錯誤?請告訴我..而且你想應該有的結果返回到第一個活動

+0

你在哪裏設置返回值?我看不到它。 – Simon

+0

startActivityForResult(i,0); –

+0

在所有設備上都有這個問題嗎? – breceivemail

回答

2

使用setResult(RESULT_OK);之前從第二個活動從第二個活動

finish()方法,你在評論你的setResult()通話活動2.

如果您從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(); 
} 
+0

我編輯了代碼請檢查 –

+1

這是你從第一個活動返回到第二個活動的代碼嗎? 意圖saved2 =新意圖(SettingsPeriodDate.this, 設置。類); startActivityForResult(saved2,100); –

+0

yes在對話結束後它從2返回到1 –

2

在此先感謝

+0

的Intent數據參數訪問該數據我正在掃描代碼,我仍然無法看到setResult,甚至被註釋掉! :) – Simon

+0

起初它被註釋掉,然後經過其中一個編輯它只是消失:) –

+0

我編輯的代碼,請檢查 –

0

完成活動之前調用setResult(RESULT_OK)。我無法在您的代碼中找到它。不要設置結果,而是再次調用活動。所以它會創造新的活動。不要使用活動1的意圖來調用新活動。

+0

請求代碼和結果代碼是不同的,0和1被保留爲結果,而不是請求 –

+0

是的,你是對的。但在大多數代碼中,我們將使用0和1,如果您使用大號碼,則可以輕鬆識別請求代碼。 –

+0

爲了便於識別,我將請求代碼作爲靜態常量存儲在某處並使用其名稱。 –

1

這裏的問題是您從Settings開始SettingsPeriodDate,然後從SettingsPeriodDate開始Settings

您不應該再次啓動設置。只需setResult()finish()當你的工作與SettingsPeriodDate完成

+0

setResult()是否激活onActivityResult()? –

+0

這不是問題。 setResult不是強制性的,它只會給你提供你使用'data.getIntExtras'獲取的數據。重要的一點是,如果你不應該開始設置, – njzk2