2013-09-03 4 views
35

Hallo Ich habe bereits ein DialogFragment geschrieben. Jetzt habe ich erkannt, dass ich einen positiven und einen negativen Button haben möchte, genau wie ein AlertDialog. Wie kann ich so etwas erreichen, während ich den Code, den ich geschrieben habe, beibehalte?Hinzufügen von positiven/negativen Button zu Dialogfeld DialogFragment

public class DoublePlayerChooser extends DialogFragment { 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState);   

    setStyle(DialogFragment.STYLE_NORMAL,0); 



} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    return new AlertDialog.Builder(getActivity()) 
      .setTitle("title") 
      .setPositiveButton("OK", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         // do something... 
        } 
       } 
      ) 
      .setNegativeButton("Cancel", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         dialog.dismiss(); 
        } 
       } 
      ) 
      .create(); 
} 



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

    View v = inflater.inflate(R.layout.doubleplayerchooser, container, false); 
    getDialog().setTitle("Enter Players"); 

    firstPlayerPicker = (ImageButton) v.findViewById(R.id.imageButton1); 
    firstPlayerPicker.setOnClickListener(new OnClickListener() { 
     public void onClick(final View v){ 

      callContactPicker(1); 

     }  
    }); 

    secondPlayerPicker = (ImageButton) v.findViewById(R.id.ImageButton01); 
    secondPlayerPicker.setOnClickListener(new OnClickListener() { 
     public void onClick(final View v){ 

      callContactPicker(2); 

     }  
    }); 

    loadFromFile = (ImageButton) v.findViewById(R.id.imageButton2); 
    loadFromFile.setOnClickListener(new OnClickListener() { 
     public void onClick(final View v){ 



     }  
    }); 

    firstTextfield = (EditText) v.findViewById(R.id.editText1); 
    secondTextfield = (EditText) v.findViewById(R.id.EditText01); 

    firstImage = (ImageView) v.findViewById(R.id.imageView1); 
    secondImage = (ImageView) v.findViewById(R.id.ImageView01); 



    return v; 
} 

Antwort

66

Ok, so habe ich es herausgefunden. Ich löschte die onCreateView und änderte den onCreateDialog dieser link hatte eigentlich die Antwort, also sollte der ganze Kredit dorthin gehen. Ich habe es gerade gepostet, nur für den Fall, dass jemand in diesem Thread zuerst stößt

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    AlertDialog.Builder b= new AlertDialog.Builder(getActivity()) 
    .setTitle("Enter Players") 
    .setPositiveButton("OK", 
     new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       // do something... 
      } 
     } 
    ) 
    .setNegativeButton("Cancel", 
     new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       dialog.dismiss(); 
      } 
     } 
    ); 

    LayoutInflater i = getActivity().getLayoutInflater(); 

    View v = i.inflate(R.layout.doubleplayerchooser,null); 

    firstPlayerPicker = (ImageButton) v.findViewById(R.id.imageButton1); 
    firstPlayerPicker.setOnClickListener(new OnClickListener() { 
     public void onClick(final View v){ 

      callContactPicker(1); 

     }  
    }); 

    secondPlayerPicker = (ImageButton) v.findViewById(R.id.ImageButton01); 
    secondPlayerPicker.setOnClickListener(new OnClickListener() { 
     public void onClick(final View v){ 

      callContactPicker(2); 

     }  
    }); 

    loadFromFile = (ImageButton) v.findViewById(R.id.imageButton2); 
    loadFromFile.setOnClickListener(new OnClickListener() { 
     public void onClick(final View v){ 



     }  
    }); 

    firstTextfield = (EditText) v.findViewById(R.id.editText1); 
    secondTextfield = (EditText) v.findViewById(R.id.EditText01); 

    firstImage = (ImageView) v.findViewById(R.id.imageView1); 
    secondImage = (ImageView) v.findViewById(R.id.ImageView01); 


    b.setView(v); 
    return b.create(); 
} 
6

Sie müssen Überschreibung der DialogFragments onCreateDialog (...) Methode:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    return new AlertDialog.Builder(getActivity()) 
      .setTitle("title") 
      .setPositiveButton("OK", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         // do something... 
        } 
       } 
      ) 
      .setNegativeButton("Cancel", 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 
         dialog.dismiss(); 
        } 
       } 
      ) 
      .create(); 
} 

von hier genommen: Android: disable DialogFragment OK/Cancel buttons

Nach der Fehlermeldung Sie bekommen ("-Anfrage Funktion muss aufgerufen werden ... ") Ich würde empfehlen:

Rufen Sie setContentView() nicht vor requestFeature() in Ihrer Aktivität oder wo immer Sie es nennen.

Außerdem:

Dont Anruf setStyle (...) innerhalb des onCreate().

Nennen Sie es, wo Sie Ihr Fragment erstellen.

public class FireMissilesDialogFragment extends DialogFragment { 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    // Use the Builder class for convenient dialog construction 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
    builder.setMessage(R.string.dialog_fire_missiles) 
      .setPositiveButton(R.string.fire, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        // FIRE ZE MISSILES! 
       } 
      }) 
      .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int id) { 
        // User cancelled the dialog 
       } 
      }); 
    // Create the AlertDialog object and return it 
    return builder.create(); 
} 
} 

Mehr Informationen über DialogFragment here:

YourDialogFragment f = new YourDialogFragment(Context); 
f.setStyle(...); 
// and so on ... 
+2

Ich habe es getan, aber ich bekomme eine Ausnahmeanforderung Funktion muss vor dem Hinzufügen von Inhalten Android – Libathos

+0

aufgerufen werden Dann stellen Sie bitte einen Code von Ihnen, und sehen Sie meine aktualisierte Antwort. –

+0

Wenn ich die onCreateView löschte, lief es ohne Fehler. Wenn das hilft Ihnen – Libathos

1

Der klarste Weg.

// Your own onCreate_Dialog_View method 
public View onCreateDialogView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.your_layout, container); // inflate here 
} 

@Override 
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    // do something with 'view' 
} 

@NonNull 
@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    // setup dialog: buttons, title etc 
    AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(getActivity()) 
      .setTitle(R.string.dialog_fragment_author_title) 
      .setNegativeButton(R.string.dialog_fragment_author_close, 
        new DialogInterface.OnClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton) { 
          dialog.dismiss(); 
         } 
        } 
      ); 

    // call default fragment methods and set view for dialog 
    View view = onCreateDialogView(getActivity().getLayoutInflater(), null, null); 
    onViewCreated(view, null); 
    dialogBuilder.setView(view); 

    return dialogBuilder.create(); 
} 
0

Das ist ein bisschen alt, aber in letzter Zeit habe ich onCreateView worden überschrieben, wenn AppCompatDialogFragment erstreckt. Setzen Sie einfach Ihre eigenen Schaltflächen in das gleiche Layout, das Sie in onCreateView zurückgeben - verwenden Sie Stile wie @style/Widget.AppCompat.Button.Borderless.

Sie erhalten den zusätzlichen Vorteil, den Dialog beim Klicken auf eine Aktionsschaltfläche zu steuern, zumal diese benutzerdefinierten Ansichten manchmal Eingaben erfordern und Sie die automatische Schließung des Dialogfelds beim Klicken auf eine Schaltfläche blockieren möchten.

Die Verwendung einer benutzerdefinierten Ansicht in onCreateDialog hat sich immer schmutzig angefühlt, weil Sie sie ohne Container aufblasen. Google hat versucht, die API mit der neuen v7 AlertDialog.Builder Methode setView(int layoutResId) ein bisschen netter zu machen, aber Sie können findViewById dann nicht anrufen.

Sie sollten ein Thema wie dieses in Ihren Stilen hinzufügen.xml:

<style name="AlertDialog" parent="Theme.AppCompat.Light.Dialog.Alert"> 
    <item name="colorPrimary">@color/material_light_blue_500</item> 
    <item name="colorPrimaryDark">@color/material_light_blue_800</item> 
    <item name="colorAccent">@color/material_light_blue_a400</item> 
    <item name="colorButtonNormal">@color/material_light_blue_500</item> 
    <item name="colorControlNormal">@color/material_light_blue_600</item> 
    <item name="colorControlActivated">@color/material_light_blue_a100</item> 
    <item name="colorControlHighlight">@color/material_light_blue_a100</item> 
</style> 

Sie onCreateDialog in Ihrem DialogFragment außer Kraft setzen müssen new AppCompatDialog(getActivity(), R.style.AlertDialog) auch zurückzukehren.