2012-10-29 61 views
0

我已經使用Theme.Holo.Dialog編寫了一個活動,以便它可以作爲登錄名/密碼通知的AlertDialog。我已使用我定義的請求代碼,使用startActivityForResult(...)開始了此活動。事情是,每當我開始活動onActivityResult(...)立即觸發,按鈕被加載和一切,但一旦我按下他們,即使我知道活動工作,因爲登錄確實發生,沒有結果發回到第一個活動按下按鈕後,我打電話setResult(...)finish()。 在此先感謝,第一次使用startActivityForResult,所以我相信我一定會錯過一些東西。startActivityForResult的問題

主要活動:

. 
. 
. 
    Intent startDialogIntent = new Intent(this,SetIdDialogAlertActivity.class); 
    startDialogIntent.setAction(getString(R.string.ACTION_START_ALERT_DIALOG_ACTIVITY)); 
    startDialogIntent.putExtra(getString(R.string.parcelable_status)); 
    IntentParcelable.configurationToParcelable(configuration, getBaseContext())); 
    startActivityForResult(startDialogIntent,getResources().getInteger(R.integer.CREATE_USER)); 

. 
. 
. 

public void onActivityResult(int requestCode, int resultCode,Intent data){ 
     super.onActivityResult(requestCode, resultCode, data); 
     Toast.makeText(getBaseContext(),"returned from activity with request code " + requestCode + " and result code " + resultCode, Toast.LENGTH_SHORT).show(); 
     if(requestCode == getResources().getInteger(R.integer.CREATE_USER)) 
      switch (resultCode){ 
       case RESULT_NEW_USER: 
        Toast.makeText(getBaseContext(),getString(R.string.SU_CorrectPassword_message), Toast.LENGTH_SHORT).show(); 
        refreshLabels(data); 
        break; 
       case RESULT_WRONG_PASSWORD: 
        Toast.makeText(getBaseContext(),getString(R.string.SU_WrongPassword_message), Toast.LENGTH_SHORT).show(); 
        break; 
      } 
    } 

然後在子活動:

public void onCreate(Bundle savedInstanceState){ 
     Logger.d(Messages.tag,System.nanoTime() + "_DIALOG_ALERT:_ON_CREATED"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.user_id_alertdialog); 
     Logger.d(Messages.tag,System.nanoTime() + "_DIALOG_ALERT:_VIEW_INFLATED"); 

     SU_passwordEditText = (EditText)findViewById(R.id.SU_passwordEditText); 
     Button okAlarmButton = (Button)findViewById(R.id.okAlarmButton); 
     Button cancelAlarmButton = (Button)findViewById(R.id.cancelAlarmButton); 

     Logger.d(Messages.tag,System.nanoTime() + "_DIALOG_ALERT:_OK_BUTTON_LOADED"); 
     okAlarmButton.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       Logger.d(Messages.tag,System.nanoTime() + "_DIALOG_ALERT:_OK_BUTTON_PRESSED"); 
       String password = SU_passwordEditText.getText().toString(); 
       if(password.equals(getString(R.string.SU_password))){ 
        Toast.makeText(getBaseContext(),getString(R.string.SU_CorrectPassword_message), Toast.LENGTH_SHORT).show(); 
        userIdEditText = (EditText)findViewById(R.id.userIdEditText); 
        String newUserName = userIdEditText.getText().toString(); 
        Logger.d(Messages.tag,System.nanoTime() + "_DIALOG_ALERT:_USERNAME_" + newUserName);     
        Configuration configuration = IntentParcelable.parcelableToConfiguration((IntentParcelable)getIntent().getParcelableExtra(getString(R.string.parcelable_status)) 
          , getBaseContext()); 
        configuration.setId(newUserName); 
        Intent setUserIntent = new Intent(); 
        setUserIntent.setAction(getString(R.string.ACTION_ACTIVITY_NEW_ID)); 
        setUserIntent.putExtra(getString(R.string.INTENT_EXTRA_SENDER_NAME),"DIALOG_ACTIVITY"); 
        setUserIntent.putExtra(getString(R.string.INTENT_EXTRA_NEW_CONFIG), IntentParcelable.configurationToParcelable(configuration, getBaseContext())); 
        exitActivity(RESULT_NEW_USER,setUserIntent); 
       }else{ 
        Toast.makeText(getBaseContext(),getString(R.string.SU_WrongPassword_message), Toast.LENGTH_SHORT).show(); 
        exitActivity(RESULT_WRONG_PASSWORD); 
       } 
      } 
     }); 

private void exitActivity(int exit_code, Intent data) { 
    setResult(exit_code,data); 
    finish(); 
} 

private void exitActivity(int exit_code) { 
    setResult(exit_code); 
    finish(); 
} 

對不起,在發佈代碼的延遲。

[更新]

我用盡了一切我能拿出和子活動仍表現古怪。我認爲自從父母的onActivityResult(...)觸發後突然完成。它沒有完成,因爲它仍然在堆棧頂上,我可以看到它,並且它確實工作,因爲我實施到Button的任何事情都完成了。但是當它再次結束它不會觸發前一個的onActivityResult(...)方法。

[更新]

MUST失去了一些東西。爲了測試的緣故,我只是創建了一個全新的Activity,它除了創建它自己之外什麼也沒做,將結果設置爲4並完成。我宣佈它的表現爲:

 <activity 
      android:name=".ActivityTest" 
      android:screenOrientation="portrait" 
      android:process=":gui_process" 
      android:exported="false"> 
     </activity> 

而且開始像這樣:

  Intent startDialogIntent = new Intent(this,ActivityTest.class); 
      startActivityForResult(startDialogIntent,getResources().getInteger(R.integer.CREATE_USER)); 

定義在我onActivityResult(...)一個新的case語句,它的行爲就像原來的活動。

+3

一些代碼會很棒! –

+0

你可以顯示你的代碼.. – mainu

+0

明天我會發布它,因爲我不得不寫這個匆忙。沒有代碼的 –

回答

0

我在另一個thread中發現了該問題。顯然,在其啓動模式中定義一個活動singleInstance會導致子活動在啓動後立即向父活動報告結果。我將父活動的啓動模式恢復到標準狀態,現在所有工作都正常運行。應該在開發者指南中記下一些國王。