ventana studio personalizado mensaje emergente ejemplo dialogo custom cuadro confirmación con botones android android-dialog android-dialogfragment

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



mensaje de confirmación android studio (5)

Esto es un poco antiguo, pero últimamente he estado anulando en onCreateView al extender AppCompatDialogFragment . Simplemente coloque sus propios botones en el mismo diseño que devuelve onCreateView : use estilos como @style/Widget.AppCompat.Button.Borderless .

Obtiene la ventaja adicional de controlar el autodescenso del diálogo cuando se hace clic en un botón de acción, especialmente debido a que estas vistas personalizadas a veces tienen entradas requeridas y desea bloquear el cierre automático del cuadro de diálogo cuando se hace clic en un botón.

Usar una vista personalizada en onCreateDialog siempre se sintió sucio porque lo está inflando sin contenedor. Google intentó hacer la API un poco más agradable con el nuevo método v7 AlertDialog.Builder setView(int layoutResId) , pero no puede llamar a findViewById continuación.

Debería agregar un Tema como este en su styles.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 sobrescribir onCreateDialog en su DialogFragment para devolver un new AppCompatDialog(getActivity(), R.style.AlertDialog) también.

Hola, ya he escrito un DialogFragment. Ahora me he dado cuenta de que quiero que tenga un botón positivo y uno negativo como 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; }


La manera más clara.

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


Ok, así es como lo descubrí. Borré el onCreateView y alteré el onCreateDialog. De hecho, este link tenía la respuesta, por lo que todo el crédito debería ir allí. Acabo de publicarlo solo en caso de que alguien tropiece 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(); }


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 here .


Tiene que anular el método 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 desde aquí: Android: deshabilitar DialogFragment Aceptar / Cancelar botones

De acuerdo con el mensaje de error que está recibiendo ("la función de solicitud debe ser llamada ...") Yo recomendaría:

No llame a setContentView () antes de requestFeature () en su actividad o donde sea que lo esté llamando.

Además:

No invoque setStyle (...) dentro de onCreate ().

Llámalo donde creas tu Fragmento.

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