2013-10-10 14 views
5

Od kilku godzin próbuję to zrozumieć.Okno dialogowe rozpoczęcia dla wyniku, aby przywrócić wartość głównej aktywności

Mam główną klasę Fragment, a następnie z onClick, który ustawiłem z ImageView w tej klasie, rozpoczynam Fragment Dialogu z prostą opcją "Tak" lub "Anuluj".

Jak to zrobić, aby po kliknięciu przez użytkownika "Ok", wyśle ​​kod wyniku z powrotem do mojego głównego fragmentu informującego go o uruchomieniu kodu (w moim przypadku ustawiam tapetę).

Ten dźwięk jest prosty, ale nie można go zrozumieć. Z góry dziękuję.

Onclick gdzie chciałbym jakoś uzyskać wynik z powrotem do:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    final View v = inflater.inflate(R.layout.image_detail_fragment, 
      container, false); 

    mImageView = (RecyclingImageView) v.findViewById(R.id.imageView); 
    mImageView.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 

      MyDialogFragment dialog = new MyDialogFragment(); 
      dialog.show(getActivity().getFragmentManager(), 
        "MyDialogFragment"); 

     } 

     public void onDialogOKPressed() { 

    ((ImageDetailFragment) (DialogFragment.this.getParentFragment())) 
        .onDialogOKPressed(); 
      dismiss(); 

     } 
    }); 

    return v; 
} 

Dialog klasy:

class MyDialogFragment extends DialogFragment { 
    private Button ButtonOk; 
    private Button ButtonCancel; 

    public MyDialogFragment() { 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.prompt, container); 
     ButtonOk = (Button) view.findViewById(R.id.button1); 
     ButtonCancel = (Button) view.findViewById(R.id.button2); 
     getDialog().setTitle("Set Wallpaper?"); 

     ButtonOk.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

               ((MyDialogFragment)(DialogFragment.this.getActivity())).onDialogOKPressed(); 
       dismiss(); 


      } 

     }); 

     ButtonCancel.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       MyDialogFragment.this.dismiss(); 

      } 
     }); 

     return view; 

    } 
} 

Odpowiedz

4

w twojej działalności, dodać metodę, która reaguje na przycisk OK jest wciśnięty, takie jak public void onDialogOKPressed(). Następnie w onClickListener swojej przycisk OK w DialogFragment, to zrobić:

public void onClick(View v){ 
    ((MyActivity)(DialogFragment.this.getActivity())).onDialogOKPressed(); 
    dismiss(); 
} 

lub umieścić nową metodę do swojego głównego fragmentu i to zrobić:

public void onClick(View v){ 
    ((MyMainFragment)(DialogFragment.this.getParentFragment())).onDialogOKPressed(); 
    dismiss(); 
} 
+0

W jaki sposób chciałbym odzyskać wynik, aby główne działanie mogło wykonać mój kod, czy nie? To było moje pytanie :) – Jack

+0

To tylko wywołuje twoją nową metodę w twojej aktywności. Wykonaj swój kod z tej nowej metody. Nie zostanie wywołany, jeśli przycisk OK nie zostanie naciśnięty. Pozbądź się bloku if/else z kodem wyniku. Wygląda na to, że planujesz ustawić tapetę, więc w nowej metodzie ustaw swoją tapetę. – Tenfour04

+0

Alternatywnie, możesz umieścić nową metodę w swoim fragmencie i zastąpić '((MyActivity) getActivity())' '((MyFragment) getParentFragment())'. – Tenfour04

2

wiem, że to jest stare pytanie, ale odpowiedź wydaje się wątpliwe akceptowane; zwłaszcza pierwsza metoda. Zastosowanie tej metody spowodowałoby ścisłe sprzężenie między MyDialogFragment i MyActivity, zasadniczo pokonując cel użycia Fragment. A Fragment powinien wiedzieć tylko, że jest podłączony do Activity, a nie do tego, jaki jest Activity.

Natomiast druga metoda nie jest jak zły, biorąc pod uwagę swoje Activity już wie, jakie Fragment użyje, nadal uważam, że istnieje lepszy sposób stosując interface:

public class MyDialogFragment extends DialogFragment { 

    public interface OnOkButtonClickListener { 
     void onOkButtonClick(); 
    } 

    private OnOkButtonClickListener mOnOkButtonClickListener; 

    private Button mOkButton; 
    private Button mCancelButton; 

    public static MyDialogFragment newInstance() { 
     return new MyDialogFragment(); 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 

     if(context instanceof OnOkButtonClickListener) { 
      mOnOkButtonClickListener = (OnOkButtonClickListener) context; 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.prompt, container, false); 
     getDialog().setTitle("Set Wallpaper?"); 

     mOkButton = (Button) view.findViewById(R.id.button1); 
     mCancelButton = (Button) view.findViewById(R.id.button2); 

     mOkButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if(mOnOkButtonClickListener != null) { 
        mOnOkButtonClickListener.onOkButtonClick(); 
       } 
      } 
     }; 

     mCancelButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       MyDialogFragment.this.dismiss(); 
      } 
     }; 
    } 

} 

Następnie można wdrożenia interface którymś Activity:

public class MyActivity extends AppCompatActivity 
     implements MyDialogFragment.OnOkButtonClickListener { 


    @Override 
    public void onOkButtonClick() { 
     // TODO: handle dialog click 
    } 

    // ... 

} 

jest również zalecana metoda komunikowania się z Fragment na developer training site.