2013-07-21 9 views
10

Ho un'app con due attività. Dall'attività principale inizio un'attività secondaria usando startActivityForResult(). L'attività secondaria restituisce i dati (sotto forma di un oggetto Intent) all'attività principale. Sull'attività principale ho un metodo onActivityResult() per gestire il ritorno dall'attività secondaria.: quando posso modificare direttamente una vista?

All'interno di questo metodo onActivityResult(), ho bisogno di aggiornare un View sull'attività principale (per riflettere i nuovi valori dei dati). Non faccio spawnare esplicitamente alcun thread. La mia domanda è: posso modificare direttamente la vista dal metodo onActivityResult() o devo inserire un evento nella coda UI per farlo? Per essere più esplicito: posso essere sicuro che il metodo onActivityResult() si trova sul thread dell'interfaccia utente e, in tal caso, posso dimenticare la coda UI?

risposta

10
  1. Sì, è possibile modificare la vista in onActivityResult(). È possibile modificare le viste di Activity in qualsiasi momento dopo aver chiamato setContentView() in onCreate(), purché si esegua sul thread dell'interfaccia utente.

  2. Sì, onActivityResult() viene chiamato sul thread dell'interfaccia utente. Questo è vero per tutti i metodi del ciclo di vita (onCreate(), onResume(), ecc.).

2

L'onActivityResult() viene eseguito nel thread dell'interfaccia utente, è possibile modificare la vista su questo metodo.

+0

Grazie! E dopo aver modificato la vista, devo chiamare 'invalidate()'? Sono un po 'confuso su quando invalidate() deve essere chiamato –

+1

no, non è necessario chiamare alcun metodo invalido. –

+0

Grazie @JeffreyBlattman –

0

Quando cerco di creare e mostrare un AlertDialog su onActivityResult() di ritorno da fare una foto, mi appare un "android.view.WindowLeaked" Errore android.view.WindowLeaked:

Activity com ... MainActivity ha perso la finestra com.android.internal.policy.impl.PhoneWindow $ DecorView {37ac7e30 VE .... R ..... I. 0,0-1272,584} che è stato originariamente aggiunto qui

non appena provo a mostrare la finestra di dialogo.

Quindi credo che non sia sempre corretto presumere che OnActivityResult() venga eseguito sul thread principale.

11

Sebbene onActivityResult sia sul thread Ui, è possibile che l'interfaccia utente non venga aggiornata quando viene modificata in onActivityResult. Sospetto che il motivo sia il ridisegno di elementi Ui a onResume che costringe gli elementi ui a resettare chiamando resetViews() di ActivityTransitionState a super.onResume().

Ho affrontato questo problema mentre aggiornavo semplicemente uno EditText all'interno di onActivityResult. EditText non è stato aggiornato.

Per ovviare al problema, salvare i dati in onActivityResult e aggiornare l'interfaccia utente allo onResume impostando un flag in onActivityResult.

+0

Ho appena trascorso una bella ora d'inferno. Grazie! –

+0

questa dovrebbe essere la risposta accettata –

0

Nel corso FrammentoAddNewAccountFragment

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
     if (resultCode == RESULT_OK) { 
      if (requestCode == Constants.CHOOSE_BANK_REQUEST_CODE) { 
       bankName = data.getStringExtra("BANK_NAME"); 
       if (!TextUtils.isEmpty(bankName)) { 
        mChooseBankEdittext.setText(bankName); 
        mReceivedBankName = bankName; 
       } 
      } 
     } 
    } 

// if sending data from next fragment to previous fragment using OnActivityResult.

setText su EditText in onResume.

@Override 
    public void onResume() { 
    super.onResume(); 
    mChooseBankEdittext.setText(bankName); 
    } 

Nel target FrammentoChooseBankNameFragment

eseguito sotto onClick() in Frammento

Intent intent = new Intent(getActivity(), AddNewAccountFragment.class); 
intent.putExtra("BANK_NAME", bankName); 
if (getFragmentManager().findFragmentByTag("AddNewAccountFragment") != null) 
      getFragmentManager().findFragmentByTag("AddNewAccountFragment").onActivityResult(Constants.CHOOSE_BANK_REQUEST_CODE, RESULT_OK, intent); 
getActivity().getSupportFragmentManager().popBackStack(); 
Problemi correlati