Android 自定义对话框

方法一:直接使用系统的,不自定义布局和功能方式

		/* @setIcon 设置对话框图标
         * @setTitle 设置对话框标题
         * @setMessage 设置对话框消息提示    
         */
        final AlertDialog.Builder normalDialog = 
            new AlertDialog.Builder(MainActivity.this);
        normalDialog.setIcon(R.drawable.icon_dialog);
        normalDialog.setTitle("我是一个普通Dialog")
        normalDialog.setMessage("你喜欢系统对话框吗?");
        normalDialog.setPositiveButton("确定", 
            new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //...To-do
            }
        });
        normalDialog.setNegativeButton("关闭", 
            new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                //...To-do
            }
        });
        
        //如果想自定义三个按钮的对话框,可以把下面的方法注释打开
//            normalDialog.setNeutralButton("第三个按钮",
//                    new DialogInterface.OnClickListener() {
//                        @Override
//                        public void onClick(DialogInterface dialog, int which) {
//                            // ...To-do
//                        }
//                    });
        // 显示
        normalDialog.show();

方法二:采用自定义布局和功能方式

自定义对话框布局: high_opinion_dialog_layout.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:paddingTop="@dimen/dp_20"
    android:paddingBottom="@dimen/dp_10"
    android:paddingLeft="@dimen/dp_15"
    android:paddingRight="@dimen/dp_15"
    android:orientation="vertical">

        <TextView
            android:text="Rate US"
            android:gravity="center"
            android:textSize="@dimen/sp_18"
            android:textColor="@color/black"
            android:layout_gravity="center_horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:text="We're glad you're enjoying using our app! Would you mind giving us a review?"
            android:gravity="center"
            android:textSize="@dimen/sp_12"
            android:layout_marginTop="@dimen/dp_5"
            android:textColor="@color/black"
            android:layout_gravity="center_horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_marginTop="@dimen/dp_15"
            android:layout_height="@dimen/dp_37">

            <Button
                android:id="@+id/btn_cancel_high_opion"
                android:layout_width="0dp"
                android:layout_height="match_parent"
                android:text="Maybe later"
                android:background="@drawable/btn_cancer_high_opion_shape"
                android:textColor="@color/white"
                android:layout_weight="1"/>

            <View
                android:layout_width="@dimen/dp_20"
                android:layout_height="match_parent"
                />
            <Button
                android:id="@+id/btn_agree_high_opion"
                android:layout_width="0dp"
                android:text="Sure"
                android:textColor="@color/white"
                android:background="@drawable/btn_agree_high_opinion_shape"
                android:layout_height="match_parent"
                android:layout_weight="1"/>

        </LinearLayout>



</LinearLayout>

然后在activity或者fragment中想要加点击弹出对话框的控件的监听事件中调用初始化下面方法

public class HomeActivity extends AppCompatActivity{
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);   
        setContentView(R.layout.activity_home);
        
        Button btn= findViewById(R.id.btn)
        //点击按钮弹出对话框
        btn.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
				       showDialog();
                    }
                });

   }
   
//初始化并弹出对话框方法
private void showDialog(){
 View view = LayoutInflater.from(this).inflate(R.layout.high_opinion_dialog_layout,null,false);
        final AlertDialog dialog = new AlertDialog.Builder(this).setView(view).create();

        Button btn_cancel_high_opion = view.findViewById(R.id.btn_cancel_high_opion);
        Button btn_agree_high_opion = view.findViewById(R.id.btn_agree_high_opion);

        btn_cancel_high_opion.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SharedPreferencesUnitls.setParam(getApplicationContext(),"HighOpinion","false");
               //... To-do
                dialog.dismiss();
            }
        });

        btn_agree_high_opion.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //... To-do
                dialog.dismiss();
            }
        });

                dialog.show();
            //此处设置位置窗体大小,我这里设置为了手机屏幕宽度的3/4  注意一定要在show方法调用后再写设置窗口大小的代码,否则不起效果会
            dialog.getWindow().setLayout((ScreenUtils.getScreenWidth(this)/4*3),LinearLayout.LayoutParams.WRAP_CONTENT);
}

}

此处附上ScreenUtils工具类代码

public class ScreenUtils {

    /**
     * 获取屏幕高度(px)
     */
    public static int getScreenHeight(Context context) {
        return context.getResources().getDisplayMetrics().heightPixels;
    }
    /**
     * 获取屏幕宽度(px)
     */
    public static int getScreenWidth(Context context) {
        return context.getResources().getDisplayMetrics().widthPixels;
    }

}

需要注意的问题总结:系统的dialog的宽度默认是固定的,即使你自定义布局的怎么修改宽高也不起作用,如果想修改弹出窗体大小,可以使用下面这段代码在调用dialog.show()方法之后来实现改变对话框的宽高的需求

		//此处设置位置窗体大小,
        dialog.getWindow().setLayout(width,height);

Android4.0的Alertdialog对话框,设置点击其他位置不消失

Android4.0以上AlertDialog,包括其他自定义的dialog,在触摸对话框边缘外部,对话框消失。

可以设置这么一条属性,当然必须先AlertDialog.Builder.create()之后才能调用这两个方法

方法一:

setCanceledOnTouchOutside(false);调用这个方法时,按对话框以外的地方不起作用。按返回键还起作用

方法二:

setCancelable(false);调用这个方法时,按对话框以外的地方不起作用。按返回键也不起作用

改变Android Dialog弹出后的Activity背景亮度:
在代码中修改.lp.alpha大小随自己要求设置

// 设置屏幕背景变暗
private void setScreenBgDarken() {
    WindowManager.LayoutParams lp = getWindow().getAttributes();
    lp.alpha = 0.5f;
    lp.dimAmount = 0.5f;
    getWindow().setAttributes(lp);
}
// 设置屏幕背景变亮
private void setScreenBgLight() {
        WindowManager.LayoutParams lp = getWindow().getAttributes();
    lp.alpha = 1.0f;
    lp.dimAmount = 1.0f;
    getWindow().setAttributes(lp);
}

如何控制弹窗弹出的位置:
一般都是在屏幕正中间弹出默认,但也可以控制从别的地方弹出,比如从底部弹出,可以这样写


        View view = LayoutInflater.from(this).inflate(R.layout.send_dialog, null);
        final Dialog dialog = new AlertDialog.Builder(this, R.style.home_dialog)
                .setView(view)
                .setCancelable(true)
                .create();
        dialog.show();

        Window win = dialog.getWindow();
        win.setGravity(Gravity.BOTTOM);   // 这里控制弹出的位置
        win.getDecorView().setPadding(0, 0, 0, 0);
        WindowManager.LayoutParams lp = win.getAttributes();
        lp.width = WindowManager.LayoutParams.MATCH_PARENT;
        lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
        dialog.getWindow().setBackgroundDrawable(null);
        win.setAttributes(lp);

        view.findViewById(R.id.cancle_dialog).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值