2013-10-10 3 views
5

Ich habe versucht, jetzt für ein paar Stunden meinen Kopf herum zu bekommen.Startdialog für Ergebnis, um Wert zur Hauptaktivität zurückzugeben

Ich habe eine Haupt-Fragment-Klasse, dann von der OnClick, die ich von einem ImageView in dieser Klasse eingerichtet habe, ich beginne ein Dialog-Fragment mit einer einfachen "Ja" oder "Abbrechen" -Option.

Wie würde ich es so machen, dass, wenn der Benutzer auf "Ok" klickt, wird es dann einen Ergebniscode zurück zu meinem Hauptfragment senden und ihm mitteilen, dass Code ausgeführt werden soll (In meinem Fall setze ich Hintergrundbild).

Das klingt einfach, aber kann nicht scheinen, es herauszufinden. Danke im Voraus.

Onclick, wo ich irgendwie möchte das Ergebnis erhalten zurück zu:

@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 Klasse:

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; 

    } 
} 

Antwort

4

In Ihrer Tätigkeit, fügen Sie eine Methode, die auf die OK-Taste gedrückt reagiert, wie public void onDialogOKPressed(). Dann wird in dem OnClickListener Ihrer OK-Taste in der DialogFragment, dies zu tun:

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

oder die neue Methode in Ihr Hauptfragment setzen und dies tun:

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

Wie würde ich dann das Ergebnis zurückholen, damit die Hauptaktivität meinen Code ausführen kann oder nicht? Das war meine Frage :) – Jack

+0

Dies nennt Ihre neue Methode nur in Ihrer Aktivität. Also führe deinen Code von dieser neuen Methode aus. Es wird nicht aufgerufen, wenn die OK-Taste nicht gedrückt wird. Befreie den if/else-Block mit dem Ergebniscode. Es sieht so aus, als ob Sie einen Hintergrund festlegen möchten. Legen Sie also bei der neuen Methode das Hintergrundbild fest. – Tenfour04

+0

Alternativ könnten Sie die neue Methode in Ihr Fragment einfügen und '((MyActivity) getActivity()) '' 'ersetzen (' (MyFragment) getParentFragment()) '. – Tenfour04

2

ich weiß, das ist eine alte Frage, aber die akzeptierte Antwort scheint zweifelhaft; vor allem die erste Methode. Die Verwendung dieses Verfahrens würde eine enge Kopplung zwischen MyDialogFragment und MyActivity einführen, was im Wesentlichen den Zweck der Verwendung eines Fragment vereitelt. A sollte nur wissen, dass es an eine Activity angeschlossen ist, nicht welche Art von Activity es ist.

Während die zweite Methode nicht als schlecht ist, wenn man bedenkt Ihre Activity bereits weiß, welche Art von Fragment wird es verwenden, ich denke immer noch, es eine bessere Methode ist unter Verwendung eines 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(); 
      } 
     }; 
    } 

} 

Dann können Sie implementieren die interface in jeder Activity:

public class MyActivity extends AppCompatActivity 
     implements MyDialogFragment.OnOkButtonClickListener { 


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

    // ... 

} 

Dies auch die empfohlene Methode ist mit einemfür die Kommunikationüber die developer training site.