2013-10-10 9 views
5

Ho cercato di capire da un paio d'ore.Avvia la finestra di dialogo per il risultato per restituire il valore all'attività principale

Ho una classe Fragment principale, quindi da onClick che ho impostato da un ImageView in quella classe, sto iniziando un frammento di finestra di dialogo con una semplice opzione "Sì" o "Annulla".

Come faccio a fare in modo che quando l'utente fa clic su "Ok", invierà quindi un codice risultato al mio frammento principale dicendogli di eseguire un codice (nel mio caso, sto impostando lo sfondo).

Questo suono è semplice ma non riesco a capirlo. Grazie in anticipo.

Onclick dove vorrei ottenere in qualche modo il risultato di nuovo a:

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

classe Dialog:

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; 

    } 
} 

risposta

4

Nella vostra attività, aggiungere un metodo che risponde al pulsante OK viene premuto, ad esempio public void onDialogOKPressed(). Poi, nel onClickListener del pulsante OK nella DialogFragment, fare questo:

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

o mettere il nuovo metodo nel vostro frammento principale e fare questo:

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

Quindi come potrei fare per ottenere il risultato in modo che l'attività principale sappia eseguire il mio codice o no? Questa era la mia domanda :) – Jack

+0

Questo semplicemente chiama il tuo nuovo metodo nella tua attività. Quindi esegui il tuo codice da questo nuovo metodo. Non verrà chiamato se il pulsante OK non viene premuto. Sbarazzarsi del blocco if/else con il codice del risultato. Sembra che tu abbia intenzione di impostare uno sfondo, quindi nel nuovo metodo, imposta lo sfondo. – Tenfour04

+0

In alternativa, puoi inserire il nuovo metodo nel tuo frammento e sostituire '((MyActivity) getActivity())' con '((MyFragment) getParentFragment())'. – Tenfour04

2

so che questa è una vecchia questione, ma la risposta accettata sembra dubbia; soprattutto il primo metodo. L'utilizzo di questo metodo introdurrebbe un accoppiamento stretto tra MyDialogFragment e MyActivity, sostanzialmente annullando lo scopo dell'utilizzo di Fragment. Un Fragment dovrebbe sapere solo che è collegato a un Activity, non che tipo di Activity è.

Mentre il secondo metodo non è come male, considerando il tuo Activity sa già che tipo di Fragment userà, penso ancora che ci sia un metodo migliore utilizzando un 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(); 
      } 
     }; 
    } 

} 

Poi si può attuare il interface in qualsiasi Activity:

public class MyActivity extends AppCompatActivity 
     implements MyDialogFragment.OnOkButtonClickListener { 


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

    // ... 

} 

Questo è anche il metodo consigliato per comunicare con un Fragment su developer training site.

Problemi correlati