2013-08-02 15 views
20

Wyobraź sobie, mam FragmentA, z którego I startDialogFragment (w pudełku jest EditText). Jak mogę odzyskać wartość z EditText do FragmentA? Próbuję zrobić coś takiego, jak this i this, ale mi się nie udało.Jak pobrać dane z DialogFragment do fragmentu?

+1

http://stackoverflow.com/questions/17966605/fragments-how-to-start-dialog-from-fragment/17968000#17968000. tutaj zwracana wartość boolowska zamiast tego zwraca wartość edittext. Lub użyj interfejsu. – Raghunandan

+0

Spróbuję)) dziękuję bardzo –

Odpowiedz

65

Metoda Fragment.onActivityResult() jest przydatna w tej sytuacji. Zajmuje getTargetRequestCode(), który jest kodem ustawionym między fragmentami, aby można go było zidentyfikować. Ponadto wykonuje kod żądania, zwykle tylko 0 jeśli kod działa dobrze, a potem Intent, który można dołączyć ciąg też, tak jak

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

Również setTargetFragment(Fragment, requestCode) powinien być stosowany we fragmencie że wynik jest wysyłany, aby go zidentyfikować. Ogólnie rzecz biorąc, masz kod w wzywającego fragmentu, który wygląda tak:

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

klasę, do przesyłania danych (DialogFragment) użyłby tego fragmentu po prostu zdefiniowane, aby wysłać dane:

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

aby otrzymać dane, używamy tego typu klasy we fragmencie, który początkowo rozpoczął 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); 

w tym momencie masz ciąg z Twojego EditText od DialogFragment w części macierzystej. Po prostu użyj metody anonimowej sendResult(int) w klasie anonimowej, aby tekst był wysyłany, gdy jej potrzebujesz.

+0

Dziękuję, jest bardzo przydatna –

+0

Bardzo dobra ekspenacja. Uratowałeś mi dzień. Wielkie dzięki! – Kristopher

+0

Witam i dziękuję za to rozwiązanie ... Czy możesz mi pomóc? Dlaczego moja metoda onActivityResult() nie może przechwycić wyniku z mojego fragmentu okna dialogowego? Kiedy mam ten sam kod ... Z góry dziękuję! –

2

Musisz wysłać dane z okna dialogowego z powrotem do działania za pomocą metody wywołania zwrotnego, a następnie zlecić dane z powrotem do fragmentu, do którego ma ono trafić. Szybki przykład:

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

    mf.iWantNewData(data); 
} 
+0

Proszę, czy możesz wyjaśnić to bardziej lub uzyskać pełniejszą wersję –

+0

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

+0

Potrzebuję Komunikując się z fragmentem zamiast działania –

2

Załóżmy sytuację, że przesyłasz jakiś plik do serwera, na kliknięcie przycisku Prześlij dialogowe należy otworzyć, co skłoniło do tytułu i opcjonalnym tag.And oknie dialogowym sam zawiera 2 przyciski: anuluj i kontynuuj.

utworzyć interfejs użytkownika, korzystając z pliku układu xml.

następnie utwórz jedną klasę rozszerzającą DialogFragment. nadpisać układ i zainicjować widoki wewnątrz metody onCreateView().

Wewnątrz tej klasy utworzyć jeden interfejs

public interface uploadDialogInterface 

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

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

A najważniejsze jest to, czego potrzebujesz, aby zastąpić onAttach metoda()

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

A w dniu kliknięcia przycisku wywołać metodę interfejsu jak

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

     } 
    } 
} 

Wewnątrz fragmentu lub działania, z którego uruchamiane jest okno dialogowe, należy zawiera atrybut 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); 
} 

I wreszcie należy zaimplementować interfejs (który został uznany wewnątrz fragmentu dialogowym) i zastąpić metodę

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

} 

myślę, że ten post będzie pomocny dla tych, którzy są przy użyciu fragmentu dialogowe dla pierwszy raz . Z trudem szukałem rozwiązania. Miejmy nadzieję, że rozwiąże to czyjś problem w przyszłości. (Przepraszamy za język)

Powiązane problemy