📜  如何在 Android 中自定义 AlertDialog 尺寸?(1)

📅  最后修改于: 2023-12-03 14:52:13.134000             🧑  作者: Mango

如何在 Android 中自定义 AlertDialog 尺寸?

在 Android 中,AlertDialog 是一个常见的弹窗控件,但是默认的样式可能不太适合你的应用。本文将介绍如何使用自定义布局和代码实现自定义 AlertDialog 尺寸。

布局文件

首先,需要创建一个布局文件来定义自定义 AlertDialog 的样式。在 res/layout 目录下创建一个新的 XML 文件,例如 custom_dialog.xml。在这个布局文件中,定义你想要的布局和样式。下面是一个示例:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/dialog_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Dialog Title"
        android:textSize="18sp" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/black" />

    <TextView
        android:id="@+id/dialog_message"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="Dialog Message"
        android:textSize="16sp" />

    <View
        android:layout_width="match_parent"
        android:layout_height="1dp"
        android:background="@color/black" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/dialog_cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:text="Cancel" />

        <View
            android:layout_width="1dp"
            android:layout_height="match_parent"
            android:background="@color/black" />

        <TextView
            android:id="@+id/dialog_ok"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:text="OK" />

    </LinearLayout>

</LinearLayout>

在这个示例布局中,我们使用了一个 LinearLayout 作为根元素,并在里面添加了一个标题和内容的 TextView,两个 View 来分隔它们,以及两个 Button。

Java 代码

接下来,需要在 Java 代码中加载上面的布局,并使用 AlertDialog.Builder 来创建一个 AlertDialog。

public class MainActivity extends AppCompatActivity {

    private TextView mDialogCancel;
    private TextView mDialogOk;
    private AlertDialog mAlertDialog;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 获取自定义布局文件的 View 对象
        View dialogView = LayoutInflater.from(this).inflate(R.layout.custom_dialog, null);

        // 找到布局中的各个控件
        TextView dialogTitle = dialogView.findViewById(R.id.dialog_title);
        TextView dialogMessage = dialogView.findViewById(R.id.dialog_message);
        mDialogCancel = dialogView.findViewById(R.id.dialog_cancel);
        mDialogOk = dialogView.findViewById(R.id.dialog_ok);

        // 创建一个 AlertDialog
        mAlertDialog = new AlertDialog.Builder(this)
                .setView(dialogView) // 设置自定义布局文件
                .create();

        // 设置标题和内容
        dialogTitle.setText("Custom Title");
        dialogMessage.setText("Custom Message");

        // 设置按钮事件
        mDialogCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mAlertDialog.dismiss();
            }
        });
        mDialogOk.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // TODO: 点击确定按钮的事件处理
            }
        });

        // 显示 AlertDialog
        mAlertDialog.show();

        // 设置 AlertDialog 的尺寸
        setDialogSize();
    }

    private void setDialogSize() {
        Window window = mAlertDialog.getWindow();
        if (window != null) {
            // 获取屏幕宽度
            DisplayMetrics metrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(metrics);
            int screenWidth = metrics.widthPixels;
            // 设置对话框宽度为屏幕宽度的 80%
            window.setLayout((int) (screenWidth * 0.8), ViewGroup.LayoutParams.WRAP_CONTENT);
            window.setGravity(Gravity.CENTER);
        }
    }

}

在这个示例代码中,我们使用 LayoutInflater.from 方法来加载布局文件,并在布局中找到各个控件。然后,通过 AlertDialog.Builder 类的 setView 方法来设置自定义布局文件,并用 create 方法创建一个 AlertDialog。接着,设置标题和内容,以及按钮的事件处理。最后,调用 setDialogSize 方法设置 AlertDialog 的尺寸。

setDialogSize 方法的实现中,我们需要获取屏幕宽度,并将对话框的宽度设为屏幕宽度的 80%。

总结

本文介绍了如何在 Android 中自定义 AlertDialog 尺寸。我们可以使用自定义布局文件来实现自定义样式,然后在 Java 代码中使用 AlertDialog.Builder 类来创建一个 AlertDialog,并设置它的尺寸。这样,我们就可以轻松地自定义 AlertDialog 的样式和行为了。