Agregar botón positivo / negativo al cuadro de diálogo de DialogFragment

Hola, ya he escrito un DialogFragment. Ahora me he dado cuenta de que quiero que tenga un positivo y un botón negativo al igual que un AlertDialog. ¿Cómo puedo lograr tal cosa mientras mantengo el código que he escrito?

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

Ok, así es como lo deduje. Borré el onCreateView y alterado el onCreateDialog este enlace realmente tenía la respuesta para que todo el crédito debe ir allí. Acabo de publicarlo sólo en caso de que alguien golpes en este hilo primero

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

Tienes que sobrescribir el método de DialogFragments onCreateDialog (…):

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

Tomado de aquí: Android: deshabilitar los botones de diálogo / OK de DialogFragment

De acuerdo con el mensaje de error que está recibiendo ("característica de solicitud debe ser llamado …") Yo recomendaría:

No llame a setContentView () antes de requestFeature () en su Actividad o dondequiera que lo esté llamando.

Además:

No llame a setStyle (…) dentro de la onCreate ().

Llámelo donde cree su Fragmento.

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

Para agregar botones de acción, llame a los setPositiveButton() y 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(); } } 

Más información sobre DialogFragment aquí .

El camino más claro.

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

Esto es un poco viejo, pero últimamente he estado anulando onCreateView al extender AppCompatDialogFragment . Sólo tienes que poner tus propios botones en el mismo diseño que vuelve en onCreateView – use estilos como @style/Widget.AppCompat.Button.Borderless .

Obtendrá la ventaja añadida de controlar el autodespedido del cuadro de diálogo cuando se hace clic en un botón de acción, especialmente porque estas vistas personalizadas a veces tienen entradas necesarias y desea bloquear el cierre automático del cuadro de diálogo cuando se hace clic en un botón.

El uso de una vista personalizada en onCreateDialog siempre se ha sentido sucio porque lo onCreateDialog con ningún contenedor. Google intentó hacer que la API fuera un poco más agradable con el nuevo método setView(int layoutResId) AlertDialog.Builder setView(int layoutResId) , pero no puedes llamar a findViewById entonces.

Deberías agregar un tema como este en tus estilos.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> 

Debe anular onCreateDialog en su DialogFragment para devolver new AppCompatDialog(getActivity(), R.style.AlertDialog) también.

  • Android: FragmentTransaction ocultar no funciona para DialogFragment
  • Prueba de DialogFragments con Robolectric
  • Forma correcta de descartar DialogFragment mientras la aplicación está en segundo plano
  • No ver la interfaz de EditNameDialogListener
  • Diálogo de soporte personalizado El texto del fragmento es el color incorrecto
  • ¿Cómo administrar un DialogFragment con RxJava?
  • ¿Cómo afecta DialogFragment al ciclo de vida del Fragmento llamante?
  • OnContextItemSelected no se llama en un DialogFragment
  • ¿Debemos usar setTargetFragment ()? Pensé que los fragmentos no deberían comunicarse entre sí
  • Posición de DialogFragment en Android
  • StackOverflowError al intentar inflar un diseño personalizado para un AlertDialog dentro de un DialogFragment
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.