Hinzufügen eines positiven / negativen Knopfes zum Dialogfenster von DialogFragment

Hallo ich habe schon ein DialogFragment geschrieben. Jetzt habe ich erkannt, dass ich will, dass es einen positiven und einen negativen Knopf hat, genau wie ein AlertDialog. Wie kann ich so etwas erreichen, während ich den Code behalte, den ich geschrieben habe?

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

  • So verhindern Sie, dass die Aktivität beim Drücken der Taste zweimal geladen wird
  • Wie kann man eine TCP-Verbindung auf unbestimmte Zeit aufbauen?
  • Wie kann man gruppierte Ansichten in Android anzeigen / ausblenden?
  • Gradle bauen fehlgeschlagen nach Update auf Android Studio 2.3 Kanarischen 3
  • Wie erstelle ich benutzerdefinierte Einstellungen mit der android.support.v7.preference Bibliothek?
  • Blinken / Flackern mit JQM und PhoneGap auf Android
  • Wie kann ich diese Warnung lösen "W / Atlas: Pointer 0x0, nicht in getPreloadedDrawables? "
  • Android Logcat Logging nur Info-Ebene auf echten Gerät. Kann keine Debug-Nachrichten bekommen, nicht einmal unbehandelte Ausnahmen
  • Verarbeiten mehr als eine Taste klicken Sie auf Android Widget
  • Android Studio und Gradle erstellen Fehler
  • Was ist der Zweck von Item-IDs im Android ListView Adapter?
  • So deaktivieren Sie Animationen im Code beim Ausführen von Espressotests
  • 5 Solutions collect form web for “Hinzufügen eines positiven / negativen Knopfes zum Dialogfenster von DialogFragment”

    Ok, das ist, wie ich es herausgefunden habe. Ich löschte die onCreateView und änderte die onCreateDialog dieser Link hatte tatsächlich die Antwort, so dass alle Kredit sollte dorthin gehen. Ich habe es gerade erst geschrieben, falls 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(); } 

    Sie müssen die DialogFragments onCreateDialog (…) Methode überschreiben:

     @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: deaktivieren DialogFragment OK / Abbrechen Tasten

    Nach der Fehlermeldung bekommst du ("Anforderungsfunktion muss angerufen werden …") würde ich empfehlen:

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

    Außerdem:

    Rufen Sie setStyle (…) nicht innerhalb des onCreate () an.

    Rufen Sie es an, wo Sie Ihr Fragment erstellen.

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

    Um Aktionsschaltflächen hinzuzufügen, rufen Sie die setPositiveButton() und setNegativeButton() :

     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(); } } 

    Weitere Informationen zum DialogFragment finden Sie hier .

    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(); } 

    Das ist ein bisschen alt, aber in letzter Zeit habe ich bei der Erweiterung von AppCompatDialogFragment onCreateView AppCompatDialogFragment . onCreateView Sie einfach Ihre eigenen Knöpfe in das gleiche Layout, das Sie in onCreateView – verwenden Sie Stile wie @style/Widget.AppCompat.Button.Borderless .

    Sie erhalten den zusätzlichen Bonus, den Dialog selbst zu deaktivieren, wenn eine Aktionsschaltfläche angeklickt wird, zumal diese benutzerdefinierten Ansichten manchmal Eingaben gefordert haben und Sie die automatische Verknüpfung des Dialogs blockieren möchten, wenn eine Schaltfläche angeklickt wird.

    Die Verwendung einer benutzerdefinierten Ansicht in onCreateDialog hat sich immer schmutzig gefühlt, weil Sie es ohne Container aufblasen. Google hat versucht, die API ein bisschen netter zu machen mit der neuen v7 AlertDialog.Builder Methode setView(int layoutResId) , aber du kannst also findViewById nicht aufrufen.

    Sie sollten ein Thema wie dieses in Ihrem styles.xml hinzufügen:

     <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 müssen in Ihrem DialogFragment onCreateDialog überschreiben, um auch new AppCompatDialog(getActivity(), R.style.AlertDialog) .

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.