2013-08-02 12 views
20

Immagina, ho FragmentA da cui I startDialogFragment (ci sono EditText nella casella). Come posso recuperare il valore da EditText a FragmentA? Provo a fare qualcosa come this e this ma non ho avuto successo.Come ottenere dati da DialogFragment a un frammento?

+1

http://stackoverflow.com/questions/17966605/fragments-how-to-start-dialog-from-fragment/17968000#17968000. in questo caso il valore booleano restituito restituisce il valore di edittext. O usare un'interfaccia. – Raghunandan

+0

lo proverò)) Grazie mille –

risposta

65

Il metodo Fragment.onActivityResult() è utile in questa situazione. Ci vuole getTargetRequestCode(), che è un codice che hai impostato tra i frammenti in modo che possano essere identificati. Inoltre, ci vuole un codice di richiesta, normalmente solo 0 se il codice ha funzionato bene, e poi un Intent, che è possibile allegare una stringa troppo, in questo modo

Intent intent = new Intent(); 
intent.putExtra("STRING_RESULT", str); 

Inoltre, il setTargetFragment(Fragment, requestCode) dovrebbe essere utilizzato nel frammento che il risultato è stato inviato da per identificarlo. In generale, si dovrebbe avere il codice nel frammento chiedendo che assomiglia a questo:

FragmentManager fm = getActivity().getSupportFragmentManager(); 
DialogFragment dialogFragment = new DialogFragment(); 
dialogFragment.setTargetFragment(this, REQUEST_CODE); 
dialogFragment.show(); 

La classe di inviare i dati (l'DialogFragment) userebbe questo frammento che abbiamo appena definito per inviare i dati:

private void sendResult(int REQUEST_CODE) { 
    Intent intent = new Intent(); 
    intent.putStringExtra(EDIT_TEXT_BUNDLE_KEY, editTextString); 
    getTargetFragment().onActivityResult(
     getTargetRequestCode(), REQUEST_CODE, intent); 
} 

per ricevere i dati, usiamo questo tipo di classe nel frammento che inizialmente ha iniziato la DialogFragment:

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // Make sure fragment codes match up 
    if (requestCode == DialogFragment.REQUEST_CODE) { 
     String editTextString = data.getStringExtra(
      DialogFragment.EDIT_TEXT_BUNDLE_KEY); 

a questo punto, si ha la stringa dal vostro EditText da DialogFragment nel frammento principale. Basta usare il metodo nella classe anonima TextChangeListener() in modo che il testo venga inviato quando ne hai bisogno.

+0

Grazie, è molto utile –

+0

Ottima spiegazione. Mi hai salvato la giornata. Molte grazie! – Kristopher

+0

Ciao e grazie per questa soluzione ... puoi aiutarmi per favore? Perché il mio metodo onActivityResult() non può acquisire i risultati dal mio frammento di finestra di dialogo? Quando ho lo stesso codice ... Grazie in anticipo! –

2

È necessario inviare i dati dalla finestra di dialogo all'attività tramite un metodo di richiamata, quindi fare in modo che l'attività restituisca i dati al frammento in cui si desidera accedere. Un breve esempio:

public void datFromDialog(String data){ 
    MyFragment mf = (MyFragment)getFragmentManager().findFragmentById(r.id.frag); 

    mf.iWantNewData(data); 
} 
+0

Per favore, puoi spiegarlo di più o ottenere più pieno di esemplificazioni –

+0

guarda qui http://developer.android.com/guide/components/fragments.html#CommunicatingWithActivity – tyczj

+0

ho bisogno del Comunicando con il frammento invece l'attività –

2

Si supponga una situazione che si sta caricando un po 'di file al server, il ticchettio delle pulsante Carica una finestra di dialogo dovrebbe aprire, spingendo per il titolo e tag.And opzionale finestra stesso contenente 2 pulsanti dire Annulla e continua.

rendere l'interfaccia utente come si desidera utilizzando il file di layout xml.

quindi creare una classe che estende DialogFragment. gonfia il layout e inizializza le viste all'interno del metodo onCreateView().

Dentro quella classe creare un'interfaccia

public interface uploadDialogInterface 

    { 
     public void senddata(String title, String tag); 
    } 

    uploadDialogInterface interfaceObj; 
    String title=""; 
    String tag=" "; 

E la cosa importante è che è necessario eseguire l'override onAttach metodo()

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    this.context=context; 
    interfaceObj= (uploadDialogInterface) getTargetFragment(); 
} 

E nel sul pulsante clicca chiamare il metodo di interfaccia come

 @Override 
public void onClick(View v) { 
    int id=v.getId(); 
    if(id== R.id.vB_fud_cancel) 
    { 
     dismiss(); 
    } 
    else if(id== R.id.vB_fud_upload) 
    { 
     title=mVideotitle.getText().toString(); 
     tag=mOptionaltag.getText().toString(); 
     if(mVideotitle.getText().toString().isEmpty()) { 
      Snackbar.make(mVideotitle,"Please enter the video title", Snackbar.LENGTH_SHORT).show(); 
     }else 
     { 
      interfaceObj.senddata(title,tag); 
      dismiss(); 

     } 
    } 
} 

E all'interno del frammento o dell'attività da cui si avvia la finestra di dialogo dovrebbe contiene l'attributo setTargetFragment.

private void callUploadDialog() 
{ 
    UploadDialogFragment fragment = new UploadDialogFragment(); 
    fragment.setTargetFragment(this, 0); 
    FragmentManager manager = getFragmentManager(); 
    FragmentTransaction ft = manager.beginTransaction(); 
    ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_in); 
    fragment.show(ft, "UploadDialogFragment"); 
    fragment.setCancelable(false); 
} 

E infine è necessario implementare l'interfaccia (che è stata dichiarata all'interno del frammento di dialogo) e l'override del metodo

@Override 
public void senddata(String title,String optionaltag) { 
    this.videoTitle=title; 
    this.optionalTag=optionaltag; 

} 

penso che questo post sarà utile per coloro che utilizzano finestra frammento per la prima volta . Ero faticato a trovare la soluzione. E speriamo che questo risolva il problema di qualcuno in futuro. (Scusate la lingua)

Problemi correlati