Android从入门到精通-对话框

一. AlertDialog

对话提示框,通常是在某项操作触发下显示的控件,需要在代码中调用show方法进行展现。AlertDialog的构造方法是protected,所以不能直接创建,有以下两种方式来创建:

创建方式
  1. 通过AlertDialog内部类Build来实现操作
//参数为该dialog要显示在哪个上下文中的对象
AlertDialog.Bulider builder = new AlertDialog.Build(this);
build.setTitle("提示");
build.setMessage("你是帅哥还是大帅哥?");
build.setPositiveButton("帅哥", new DialogInterface.OnClickListener() {
     @Override
     public void onClick(DialogInterface dialogInterface, int i) {
       finish();
     }
   });
);
builder.setNegativeButton("大帅哥",null);
builder.show();
  1. 通过Build来创建AlertDialog对象,但是自己进行控件设置
AlertDialog dialog = new AlertDialog.Builder(this).create();
dialog.setTitle("提示");
dialog.setMessage("您确定退出程序吗?");
dialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() {
       @Override
       public void onClick(DialogInterface dialogInterface, int i) {
          finish()
 	    }
})
dialog.show();
自定义Dialog
  1. 设置布局
    dialog_demo.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:orientation="vertical"
    android:layout_gravity="center_vertical"
    android:background="@mipmap/dialog_bg"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="您确定要退出吗?"
        android:textFontWeight="2"
        android:textSize="36sp"
        android:textColor="#FF3300"
        android:textStyle="bold"
        android:layout_gravity="center"
        android:layout_marginTop="256dp"
        android:layout_marginBottom="20dp"
        />
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:gravity="center"
        >
        <Button
            android:id="@+id/btn_no"
            android:layout_width="120dp"
            android:layout_height="50dp"
            android:background="@mipmap/no_btn"
            android:layout_marginRight="10dp"
            android:layout_marginEnd="10dp" />
        <Button
            android:id="@+id/btn_yes"
            android:layout_width="120dp"
            android:layout_height="50dp"
            android:background="@mipmap/yes_btn"
            android:layout_marginLeft="10dp"
            android:layout_marginStart="10dp" />
    </LinearLayout>

</LinearLayout>
  1. 将布局添加到自定义对话框中,设置监听
    Mydialog.java
public class MyDialog extends Dialog {

    public MyDialog(@NonNull Context context, int themeResId) {
        super(context, themeResId);
        setContentView(R.layout.dialog_demo);

        findViewById(R.id.btn_yes).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.exit(0);
            }
        });

        findViewById(R.id.btn_no).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
    }
}
  1. 设置style,取消或添加对话框原有属性
    res/values/styles.xml
  <!--自定义对话框-->
    <style name="MyDialog" parent="android:Theme.Dialog">
        <item name="windowNoTitle">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>
  1. 建立MyDialog对象,使用show()方法显示
 MyDialog dialog = new MyDialog(this, R.style.MyDialog);
 dialog.show();

AlertDialog中使用数据适配器

将一组数据如数组、List根据相应的布局展示在对话框中。实现方式如下:

//定义一组数据
String[] item = ["1", "2", "3", "4"];
//参数1:当前上下文,参数2:布局资源id,参数3:需要填充数据的控件id,参数4:数据源
ArrayAdapter adapter = new ArrayAdapter(this, R.layout.xx,
 R.id.xx, item);
 AlertDialog.Builder builer = new AlertDialog.Builder(this)
                .setTitle("请选择")
                //参数1:适配器对象(对数据显示样式的规则制定器)
                //参数2:监听器
                .setAdapter(adapter, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Toast.makeText(MainActivity.this,items[i],Toast.LENGTH_SHORT).show();
                        dialogInterface.dismiss();
                    }
                });
        builer.show();

二. DialogFragment

参考学习
本质上是一个Fragment,只是在内部绑定了Dialog。在使用时一般会新建一个类继承DalogFragment。

创建方式
  1. 跟Fragment的创建方式一样,在OnCreateView()方法返回View,默认会居中显示
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog_my_test,container, false);
        return view;
    }

  1. 重载onCreateDialog方法
public class MyDialogFrziagment extends DialogFragment{

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
       AlertDialog dialog =  new AlertDialog.Builder(getActivity())
               .setTitle("提示")
               .setMessage("你是帅哥吗?")
               .setPositiveButton("是", new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int which) {

                   }
               })
               .setNegativeButton("不是", new DialogInterface.OnClickListener() {
                   @Override
                   public void onClick(DialogInterface dialog, int which) {

                   }
               }).create();
        return dialog;

    }
  1. 使用
   public class MainActivity extends AppCompatActivity {
    MyDialogFragment dialogFragment;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        dialogFragment = new MyDialogFragment();
        dialogFragment.show(getSupportFragmentManager(), "dialog");
    }
}

使用回调

在MyDialogFrziagment中定义回调接口

  1. 定义回调接口

    private Callback callback;


    public  interface Callback{
        void onPhoto();
        void onCamera();
    }


    public void setCallback(Callback callback) {
        this.callback = callback;
    }
  1. 添加回调事件
 AlertDialog.Builder builder =  new AlertDialog.Builder(getContext())
                .setTitle("选择头像")
                .setPositiveButton("相册", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if(callback!=null){
                            callback.onPhoto();
                        }
                    }
                })
                .setNegativeButton("相机", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        if(callback!=null){
                            callback.onCamera();
                        }
                    }
                });
        return builder.create();
  1. 使用
SelectPhotoFragment selectPhotoFragment = new SelectPhotoFragment();
        selectPhotoFragment.show(getSupportFragmentManager(), "photo");
        selectPhotoFragment.setCallback(new SelectPhotoFragment.Callback() {
            @Override
            public void onPhoto() {
                openCreame();
            }

            @Override
            public void onCamera() {

            }
        });
设置style中dialog的属性
 <style name="MyMinDialogWidth" parent="Base.Theme.AppCompat.Dialog">
        <item name="android:windowMinWidthMajor">100%</item>
        <item name="android:windowMinWidthMinor">100%</item>
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>

   <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
   
        <item name="android:alertDialogTheme">@style/MyMinDialogWidth</item>
        <item name="android:dialogTheme">@style/MyMinDialogWidth</item>
    </style>
//Theme.AppCompat.Dialog主题常用的一般有以下属性:

<!-- 背景透明 -->  

<item name="android:windowBackground">@android:color/transparent</item>  

<!-- 边框 -->  

<item name="android:windowFrame">@null</item>  

<!-- 是否浮现在activity之上 -->  

<item name="android:windowIsFloating">true</item>  

<!-- 是否半透明 -->  

<item name="android:windowIsTranslucent">true</item>  

<!-- 是否无标题 -->  

<item name="android:windowNoTitle">true</item>  

<!-- Dialog背景样式 --> 

<item name="android:background">@android:color/transparent</item>  

<!-- 模糊 -->  

<item name="android:backgroundDimEnabled">true</item>  

<!-- 遮罩层 -->  

<item name="android:backgroundDimAmount">0.5</item> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值