Android应用中如何自定义弹框?

Posted kaolagirl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android应用中如何自定义弹框?相关的知识,希望对你有一定的参考价值。

在我们应用开发过程中,系统自带的弹框效果不是很好看,所以我们就得自己去自定义,下面就来简单说说吧

1.效果

2.自定义弹框布局(alert_dialog_defaut.xml)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/content_corner">
        <LinearLayout
            android:gravity="center"
            android:layout_marginTop="15dp"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <ImageView
                android:id="@+id/iv_dialog_tip"
                android:visibility="gone"
                android:layout_marginRight="4dp"
                android:layout_gravity="center"
                android:src="@drawable/dialog_tip"
                android:layout_width="13dp"
                android:layout_height="13dp"/>
            <TextView
                android:id="@+id/title"
                android:text="标题"
                android:gravity="center"
                android:textColor="@color/theme_defaultText"
                android:textSize="@dimen/larMax_size"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        </LinearLayout>

        <TextView
            android:id="@+id/content"
            android:layout_margin="15dp"
            android:gravity="center"
            android:text="内容"
            android:textSize="@dimen/order1"
            android:lineHeight="20dp"
            android:textColor="@color/theme_textColor"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
        <TextView
            android:layout_marginTop="10dp"
            android:background="@color/banner_backColor"
            android:layout_width="match_parent"
            android:layout_height="0.8dp"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <Button
                android:id="@+id/cancel_btn"
               android:background="@color/white"
                android:textSize="@dimen/order1"
                android:text="取消"
                android:layout_weight="1.0"
                android:layout_width="wrap_content"
                android:layout_height="42dp"/>
            <TextView
                android:background="@color/banner_backColor"
                android:layout_width="0.5dp"
                android:layout_height="match_parent"/>
            <Button
                android:id="@+id/comfirm_btn"
                android:background="@color/white"
                android:text="确认"
                android:textSize="@dimen/order1"
                android:textColor="@color/theme_color"
                android:layout_weight="1.0"
                android:layout_width="wrap_content"
                android:layout_height="42dp"/>
        </LinearLayout>
    </LinearLayout>

</LinearLayout>
2.自定义一个弹框工具类(AlertDialogUtils.java)
// 自定义dialog对话框
public class AlertDialogUtils {
    private static View view_custom;
    public static AlertDialog.Builder builder;
    public  static AlertDialog alert ;
    public static TextView tv_dialog_title, tv_dialog_content;
    public static Button dialog_cancelBtn,dialog_confirmBtn;

    public static AlertDialogUtils getInstance() {
        return new AlertDialogUtils();
    }

    /**
     * todo 带有确认取消按钮的自定义dialog
     * @param context 上下文对象
     * @param title 标题
     * @param content 内容
     */
    public static void showConfirmDialog(Context context, String title, String content){
        builder = new AlertDialog.Builder(context);
        alert = builder.create();
        alert.show();
         
         //引入布局
        view_custom =LayoutInflater.from(context).inflate(R.layout.alert_dialog_defaut,null,false);
        tv_dialog_title = view_custom.findViewById(R.id.title);
        tv_dialog_title.setText(title);
        tv_dialog_content =  view_custom.findViewById(R.id.content);
        tv_dialog_content.setText(content);

        alert.setCancelable(false); //点击空白处不关闭弹窗

         //为取消按钮设置点击监听
        view_custom.findViewById(R.id.cancel_btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
             if(mOnDialogButtonClickListener !=null){
                 mOnDialogButtonClickListener.onNegativeButtonClick(alert);
             }
            }
        });
        //为确认按钮设置点击监听
        view_custom.findViewById(R.id.comfirm_btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(mOnDialogButtonClickListener !=null){
                    mOnDialogButtonClickListener.onPositiveButtonClick(alert);
                }
            }
        });
        //使用布局
        alert.getWindow().setContentView(view_custom);
    }


    //todo 按钮点击回调接口
    public static OnDialogButtonClickListener mOnDialogButtonClickListener;
    
    public void setMonDialogButtonClickListener(OnDialogButtonClickListener listener){
        this.mOnDialogButtonClickListener = listener;
    }
    public interface OnDialogButtonClickListener{
        void onPositiveButtonClick(AlertDialog dialog); //确认
        void onNegativeButtonClick(AlertDialog dialog); //取消
    }

}

3.在activity/Fragment中使用

使用工具类方便,就是哪里用到直接调用就可以了,而不用每次需要时都要重新引入布局,创建一大堆

        AlertDialogUtils dialogUtils =AlertDialogUtils.getInstance();
        AlertDialogUtils.showConfirmDialog(GoodAddress.this,"确定删除此地址吗?","删除之后无法恢复,请谨慎考虑!");
        dialogUtils.setMonDialogButtonClickListener(new AlertDialogUtils.OnDialogButtonClickListener() {
            @Override
            public void onPositiveButtonClick(androidx.appcompat.app.AlertDialog dialog) {
                //点击确认按钮要做的事情
            }

            @Override
            public void onNegativeButtonClick(androidx.appcompat.app.AlertDialog dialog) {
               //点击取消按钮关闭弹框
                dialog.dismiss();
            }
        });

这样子就已经完成啦!!!!!最后,附上效果图

以上是关于Android应用中如何自定义弹框?的主要内容,如果未能解决你的问题,请参考以下文章

片段中ListView的android自定义适配器

Android - 如何将自定义对象传递给片段

为动态创建的 Android 片段提供自定义属性值

Android:在片段内膨胀自定义视图

Android AlertDialog自定义布局

自定义 popWindow弹框 工具包