Resumen de uso de AlertDialogFragment

1. Diagrama de IU de demanda

La representación aproximada se muestra en la figura siguiente. Es solo una ventana emergente de recordatorio simple, que contiene un TextView y dos botones de botón en los que se puede hacer clic para cancelación o confirmación.
Inserte la descripción de la imagen aquí

Dos, pasos de diseño de código

El diseño y uso de la ventana emergente se divide en cinco pasos:
(1) Un diseño
dibujable : dialog_background.xml , como el fondo utilizado en (2), que incluye: esquinas de
forma
: radio
sólido: color
y otras configuraciones de atributos.

(2) Un diseño layout.xml:
alert_dialog.xml , usando dialog_background.xml como fondo.
(3) AlertDialogFragment.java , diseñe la ventana emergente

(4) Defina una clase de herramienta DialogUtils , que define el método showAlertDialog correspondiente.
(5) En el evento de clic correspondiente en la interfaz principal MainActivity, llame al método showAlertDialog para mostrar la ventana emergente.

Tres, código fuente

Los códigos de los primeros cuatro pasos se pueden reutilizar directamente en el futuro, y el quinto paso se puede modificar ligeramente según las necesidades de desarrollo reales.

(1) Un elemento de
diseño : dialog_background.xml , como fondo general:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="15dp" />
    <solid android:color="@color/cardview_shadow_start_color" />
</shape>

El valor del color, la forma, etc. se pueden definir aquí.
Como esquinas redondeadas 15dp, valor de color, opacidad, etc.

(2) Un diseño layout.xml:
alert_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/dialog_background">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:text="确认要关闭超速报警吗?"
        android:textColor="@color/white"
        android:textSize="22sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginBottom="8dp"
        android:layout_marginTop="50dp"
        android:text="取消"
        android:background="@color/design_default_color_error"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toStartOf="@+id/guideline2"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/title" />

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintGuide_percent="0.5" />

    <Button
        android:id="@+id/sure"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="确认"
        android:background="@color/design_default_color_error"
        app:layout_constraintBottom_toBottomOf="@+id/cancel"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="@+id/guideline2"
        app:layout_constraintTop_toTopOf="@+id/cancel" />

</androidx.constraintlayout.widget.ConstraintLayout>

Usando el elemento de dibujo en (1): dialog_background.xml como fondo, se diseña la interfaz de la ventana emergente.

(3)
AlertDialogFragment.java : hereda DialogFragment.
De acuerdo con el xml definido en (2), dibuje el diálogo y agregue eventos de clic a los controles.

public class AlertDialogFragment extends DialogFragment {
    
    

    private AlertDialogFragmentListener listener;
    private String title;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater,
                             @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    
    
        getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE);

        Bundle arguments = getArguments();
        title = arguments.getString("title");

        View view = inflater.inflate(R.layout.alert_dialog, container, false);

        TextView titleText = view.findViewById(R.id.title);
        Button cancel = view.findViewById(R.id.cancel);
        Button sure = view.findViewById(R.id.sure);
        titleText.setText(title);
        cancel.setOnClickListener(v -> getDialog().cancel());
        sure.setOnClickListener(v -> {
    
    
            if (listener != null) {
    
    
                listener.onSure();
            }
            getDialog().cancel();
        });
        return view;
    }

    @Override
    public void onStart() {
    
    
        super.onStart();
        Dialog dialog = getDialog();
        if (dialog != null ) {
    
    
            DisplayMetrics dm = new DisplayMetrics();
            getActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
            int height = (int) (dm.heightPixels * 0.65);
            dialog.getWindow().setLayout((int) (dm.widthPixels * 0.5), height);
            dialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        }
    }

    public interface AlertDialogFragmentListener {
    
    
        void onSure();
    }

    public void setListener(AlertDialogFragmentListener listener) {
    
    
        this.listener = listener;
    }
}

Familiarizado con los métodos como onCreateView y onStart.
Una interfaz está expuesta al exterior, que contiene el método onSure () después de hacer clic en el botón Aceptar.

(4) Clase de herramienta DialogUtils , que define el método showAlertDialog correspondiente.
Es conveniente reutilizar el evento de clic del mismo tipo de ventana emergente.

public class DialogUtils {
    
    

    public static void showAlertDialog(
            AppCompatActivity activity,
            String title,
            AlertDialogFragment.AlertDialogFragmentListener listener) {
    
    

        AlertDialogFragment fragment = new AlertDialogFragment();
        Bundle bundle = new Bundle();
        bundle.putString("title", title);
        fragment.setArguments(bundle);
        fragment.setListener(listener);
        fragment.show(activity.getSupportFragmentManager(), "fragment");
    }
}

(5) En el evento de clic correspondiente en la interfaz principal, como MainActivity, de acuerdo con la situación, llame al método showAlertDialog para mostrar la ventana emergente.
Como sigue:
Inserte la descripción de la imagen aquí
El código en onClick es el siguiente:

@Override
            public void onClick(View v) {
    
    
                if (isQuickOverSpeedAlarmOpen) {
    
    
                    DialogUtils.showAlertDialog(this,
                            String.format(getString(R.string.confirm_close_dialog),
                                    getString(R.string.over_speed_alarm)),
                            () -> {
    
    
                                changeIsOpen(view);
                                ToastUtils.show(String.format(getString(R.string.has_closed),
                                        getString(R.string.over_speed_alarm)));
                            });
                    break;
                }
            }

Nota en la cadena: ¿ Confirma que desea desactivar el uso de% en %?

Supongo que te gusta

Origin blog.csdn.net/ambitionLlll/article/details/114491959
Recomendado
Clasificación