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.
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:
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 %?