2013-08-02 12 views
20

Stellen Sie sich vor, ich habe FragmentA von dem ich startDialogFragment (es gibt EditText im Kasten). Wie kann ich den Wert von EditText zu FragmentA zurückbekommen? Ich versuche etwas wie this und this zu machen, aber ich war nicht erfolgreich.Wie erhalte ich Daten von DialogFragment zu einem Fragment?

+1

http://stackoverflow.com/questions/17966605/fragments-how-to-start-dialog-from-fragment/17968000#17968000. Hier gibt der boolesche Wert stattdessen den Edittext-Wert zurück. Oder benutze eine Schnittstelle. – Raghunandan

+0

Ich werde es versuchen)) Vielen Dank –

Antwort

65

Die Fragment.onActivityResult() Methode ist in dieser Situation nützlich. Es dauert getTargetRequestCode(), das ist ein Code, den Sie zwischen Fragmenten einrichten, damit sie identifiziert werden können. Darüber hinaus ist es ein Anforderungscode nimmt, in der Regel nur 0, wenn der Code gut funktioniert, und dann eine Intent, die Sie auch einen String anhängen können, wie so

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

Auch sollte die setTargetFragment(Fragment, requestCode) im Fragment verwendet werden dass das Ergebnis gesendet wird, um es zu identifizieren. Insgesamt würden Sie Code in dem anfordernden Fragmente haben, die wie folgt aussieht:

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

Die Klasse zum Senden von Daten (das DialogFragment) verwenden würde dieses Fragment wir gerade definiert zu senden, um die Daten:

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

Um die Daten zu erhalten, verwenden wir diese Art von Klasse in dem Fragment, das zunächst die DialogFragment gestartet:

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); 

an dieser Stelle haben Sie die Zeichenfolge aus Ihrem EditText aus der DialogFragment im Elternfragment. Verwenden Sie einfach die sendResult(int) Methode in Ihrer anonymen Klasse TextChangeListener(), so dass der Text gesendet wird, wenn Sie es brauchen.

+0

Vielen Dank, es ist sehr nützlich –

+0

Sehr gut explenation. Du hast meinen Tag gerettet. Danke vielmals! – Kristopher

+0

Hallo und vielen Dank für diese Lösung ... Können Sie mir bitte helfen? Warum kann meine onActivityResult() -Methode das Ergebnis meines Dialogfragments nicht erfassen? Wenn ich den gleichen Code habe ... Danke im Voraus! –

2

Sie müssen die Daten aus dem Dialog über eine Callback-Methode zurück an die Aktivität senden und dann die Aktivität an das Fragment zurückgeben, an das sie gesendet werden soll. Nur ein kleines Beispiel:

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

    mf.iWantNewData(data); 
} 
+0

Bitte, können Sie es mehr erklären oder mehr vollständige Beispiel –

+0

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

+0

Ich brauche die die Kommunikation mit Fragment stattdessen Aktivität –

2

eine Situation an, dass Sie eine Datei an den Server hochladen, auf Klicken der Upload-Button sollte ein Dialog geöffnet, woraufhin für Titel und optional tag.And der Dialog selbst mit 2 Tasten sagen Abbrechen und weiter.

Erstellen Sie die Benutzeroberfläche wie gewünscht mit der Layout-XML-Datei.

dann erstellen Sie eine Klasse, die DialogFragment erweitert. pumpen Sie das Layout auf und initialisieren Sie Ansichten in der onCreateView() - Methode.

Innerhalb dieser Klasse schaffen eine Schnittstelle

public interface uploadDialogInterface 

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

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

Und das Wichtigste ist, Sie onAttach außer Kraft setzen müssen() -Methode

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

und in der auf Schaltfläche, um die Interface-Methode wie

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

     } 
    } 
} 

und im Innern des Fragments oder Aktivität, von dem Sie den Dialog starten sollten enthält das SetTargetFragment-Attribut.

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

Und schließlich sollten Sie die Schnittstelle implementieren (das innerhalb des Dialogfragment deklariert wurde) und überschreiben die Methode

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

} 

Ich denke, dieser Beitrag wird hilfreich sein für diejenigen, die für das Dialogfragment verwenden erstes Mal . Ich hatte Mühe, die Lösung zu finden. Und hoffentlich wird dies das Problem von jemandem in der Zukunft lösen. (Entschuldigung für die Sprache)

Verwandte Themen