2012-08-24 9 views
7

Ich habe Fragment, das DialogFragment erstreckt, und ich habe ein eigenes Layout für sie, die zwei edittexts und zwei Tasten enthält - ok und abzubrechen. Mein Dialog zeigt ganz gut, mit der onCreateView Methode zur Festlegung des Layouts, aber ich weiß nicht, wie Tastenklicks zu handhaben. In der onCreateView-Methode funktioniert button.setOnClickListener nicht. Das mag eine einfache Lösung sein, aber ich stecke mehrere Stunden fest. Ich würde einen Rat oder Beispielcode sehr schätzen.Griff Tastenklicks in einem DialogFragment

PS Ich möchte nicht AlertDialog verwenden, weil in diesem Fall beim Klicken auf den OK-Button der Dialog sich automatisch abmeldet, und ich kann keine Überprüfung auf dem Editiertext machen (Beispiel: wenn der Benutzer OK drückt) button und die Edittexts sind leer. Ich möchte nicht, dass der Dialog verschwindet). So ging ich mit der Option zum Erstellen eines benutzerdefinierten Dialogs und einfach das Verhalten der Schaltflächen zu verwalten.

Antwort

5

entlang dieser Linien Do

Dialog dl = mDialogFragment.getDialog(); 
Button btn = dl.findViewbyid(R.id.btn); 
btn.setOnclicklistener(this); 
+1

u danken. Ich habe schon eine Lösung wie diese gefunden. \t \t \t \t ButtonOK.setOnClickListener (neu View.OnClickListener() { \t @Override \t public void onClick (Ansicht Ansicht) { \t \t \t \t \t} \t} \t}); aber vielleicht funktioniert deine Lösung auch. Thx sowieso! – Sandra

9

Dies ist der Code für einen Dialog ist Ich verwende (die eigentliche GUI für den Dialog im Layout Ressource confirm_dialog.xml definiert):

public class ConfirmDialog extends DialogFragment { 

    public static String TAG = "Confirm Dialog"; 

    public interface ConfirmDialogCompliant { 
     public void doOkConfirmClick(); 
     public void doCancelConfirmClick(); 
    } 

    private ConfirmDialogCompliant caller; 
    private String message; 

    public ConfirmDialog(ConfirmDialogCompliant caller, String message){ 
     super(); 
     this.caller = caller; 
     this.message = message; 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     final View view = inflater.inflate(R.layout.confirm_dialog, container, false); 
     getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE); 
     ((TextView) view.findViewById(R.id.textview_confirm)).setText(message); 
     ((Button) view.findViewById(R.id.ok_confirm_button)).setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       // When button is clicked, call up to owning activity. 
       caller.doOkConfirmClick(); 
      } 
     }); 
     ((Button) view.findViewById(R.id.cancel_confirm_button)).setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       // When button is clicked, call up to owning activity. 
       caller.doCancelConfirmClick(); 
      } 
     }); 
     return view; 
    } 

} 

Der Dialog wird mit den folgenden Zeilen erstellt

confirm_dialog = new ConfirmDialog(this, message); 
confirm_dialog.show(getActivity().getSupportFragmentManager(), ConfirmDialog.TAG); 

Die Schnittstellendefinition als verwendet wird Stellen Sie sicher, dass der Aufrufer (Fragment oder Aktivität) die Methoden zum Behandeln der vom Controller ausgelösten Ereignisse implementiert. Das heißt, ein Fragment oder eine Aktivität, die diesen Dialog aufruft, muss die angegebene Schnittstelle implementieren.
Vielleicht gibt es eine bessere Lösung, aber das ist das, was ich herausgefunden. Ich hoffe es hilft!

+0

das Einstellen des onClickListener wie dieses funktionierte nicht für mich. Es gab mir Fehler. Ich fand eine Lösung für mein Problem und schrieb es als Kommentar zur ersten Antwort. Vielen Dank für Ihre Antwort. – Sandra

+0

Dies funktioniert, wenn Sie Ihr Layout von einer XML-Ressource aus aufblasen. Wenn Sie Ihr Layout programmatisch erstellen, müssen Sie setOnClickListener auf Ihrer Button-Referenz aufrufen. –

+0

Ja, ich habe auch ein Layout von einer XML-Ressource in der OnCreateView-Methode aufgeblasen. Das Problem, das ich hatte war das: myButton.setOnClickListener (new OnClickListener() {} gab mir einen Fehler, so dass die Lösung myButton.setOnClickListener (new View.OnClickListener() {}. Ich weiß nicht, warum es nicht war erkenne meinen Zuhörer auf diese Weise, aber es tat es. – Sandra

8

hier ist ein Beispiel einer zum handel Taste auf einem Dialog aus der Klasse FragmentDialog abbrechen:

i android.support.v4.app.DialogFragment verwendet;

public class MyDialogFragment extends DialogFragment { 
    public MyDialogFragment(){}  
    public static String TAG = "info Dialog"; 
    Button btn; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     final View view = inflater.inflate(R.layout.info_layout, container); 
     getDialog().requestWindowFeature(STYLE_NO_TITLE); 
     btn=(Button)view.findViewById(R.id.close_dialog_btn_info_layout); 
     btn.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       getDialog().dismiss(); 
      } 
     }); 

     return view; 
    } 





} 
3

Eine weitere Option ist Ihre benutzerdefinierte DialogFragment Klasse implementieren OnClickListener zu lassen. Dazu einfach setOnClickListener aus irgendwelchen Ansichten möchten Sie Klicks auf zu handhaben und die Klicks in onClick zu fangen.

// 1. implement OnClickListener 
public class MyDialogFragment extends DialogFragment implements View.OnClickListener { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     View view = inflater.inflate(R.layout.my_dialog_layout, null); 

     // 2. set click listeners on desired views 
     view.findViewById(R.id.my_view_1).setOnClickListener(this); 
     view.findViewById(R.id.my_view_2).setOnClickListener(this); 


     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setView(view) 
       // ... 
     return builder.create(); 
    } 

    // 3. capture the clicks and respond depending on which view 
    @Override 
    public void onClick(View view) { 
     switch (view.getId()) { 
      case R.id.my_view_1: 
       // do something 
       break; 
      case R.id.my_view_2: 
       // do something 
       break; 
      default: 
       break; 
     } 
    } 
} 
1

Es ist einfach in Aktivität, aber in DialogFragment machen wir noch ein paar Codes.

Hier, wie ich mein Problem gelöst, in der o DialogFragment Klasse tun, um Ihre Rutin findView

btn_ocak = (Button) view.findViewById(R.id.btn_cal_ocak); 
    btn_subat = (Button) view.findViewById(R.id.btn_cal_subat); 
    btn_mart = (Button) view.findViewById(R.id.btn_cal_mart); 
    btn_nisan = (Button) view.findViewById(R.id.btn_cal_nisan); 


btn_ocak.setOnClickListener(this); 
    btn_subat.setOnClickListener(this); 
    btn_mart.setOnClickListener(this); 
    btn_nisan.setOnClickListener(this); 

Implementieren onClick OnClickListener Ihrer Klasse

public class CalendarPopUp extends DialogFragment implements View.OnClickListener 

und tun, was Sie in onClick Methode möchten, Dadurch aktivierten wir die onClick-Ereignisse unserer Ansichten.

, und wenn Sie sich fragen, wie Werte passieren folgen Sie diesen Schritt clike_here