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; }
- Llamar a DialogFragment del fragmento
- El método show (FragmentManager, String) en el tipo DialogFragment no es aplicable para los argumentos (FragmentTransaction, String)
- CommitAllowingStateLoss en DialogFragment
- Fije onclicklistener en un botón dentro de un DialogFragment
- No se encontró ninguna vista para id - DialogFragment + Fragment
- Cómo reemplazar un fragmento de diálogo de pantalla completa con otro sin mostrar la actividad de los padres?
- Android DialogFragment con tema de AppCompat tema
- Después de cambiar la orientación de la pantalla, el diálogo aparece aparentemente sin ninguna llamada
- DialogFragment animación de diseño y "Intentar destruir la ventana mientras dibuja!" Error
- ViewPager, getChildFragmentManager () & getFragmentManager ()
- Interceptar DialogFragment descartar dentro de la actividad
- DialogFragment anidado múltiple de Android
- Comunicación entre fragmentos / cuadros de diálogo en android
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.
- NotifyDataSetChanged no funciona en RecyclerView
- Orientación de la imagen desde la galería / la intención de la cámara