Dialog自定义对话框

一、自定义对话框

实现步骤:

1.自定义一个类,继承于Dialog类,在构造方法中调用setContentView(R.layout.xx)来设定对话框的布局 

2.设定自定义对话框的风格(不显示标题栏,不显示背景),由于继承了Dialog,默认添加了Dialog标题的一栏 

3.找到res-->values-->styles.xml设置风格 

4.调用含设定对话框风格参数的构造 

5.对自定义对话框中的某些控件添加事件 

6.实例化自定义的对话框,显示


一、新建对话框的布局文件(即弹出的对话框的样子)

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:orientation="vertical"
    android:gravity="center_horizontal"
    android:background="#FFFF00"
    android:padding="10dp">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="提示"
        android:textSize="34sp"
        android:textStyle="bold"
        android:layout_marginTop="30dp"/>
    <View
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:background="#ffffff"
        android:layout_marginTop="10dp"
        android:layout_marginBottom="10dp"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="您确定要退出当前程序么"
        android:layout_marginTop="10dp"
        android:textSize="20dp"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center_horizontal">
        <Button
            android:id="@+id/btn1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="否"
            android:onClick="onClick"
            />
        <Button
            android:id="@+id/btn2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="是"
            android:onClick="onClick"
            />
    </LinearLayout>

</LinearLayout>

二、设置弹出对话框的点击按钮

activity.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:gravity="center_horizontal"
    android:padding="10dp">

    <Button
        android:id="@+id/btn1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="自定义对话框"
        android:onClick="onClick"
        />
</LinearLayout>

三、设置对话框的风格样式

在style.xml中添加如下代码

    <style name="mydialog" parent="android:style/Theme.Dialog">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>

因为自定义的MyDialog是继承于Dialog,所以会默认添加了Dialog的标题这一栏非常不美观,因此使用重新自定义对话框的风格样式。name="android:windowNoTitle"设置为true代表无窗口标题,android:windowBackground表示对话框背景,@android:color/transparent为使用透明色。

完整的style文件在app-->res-->values-->styles.xml,完整代码如下:

styles.xml

<resources>
    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    <style name="mydialog" parent="android:style/Theme.Dialog">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>
</resources>

四、建立MyDialog类继承Dialog类实现对话框管理

MyDialog.java

package com.administrator.dialogtest;

import android.app.Dialog;
import android.content.Context;
import android.support.annotation.NonNull;
import android.view.View;
import android.widget.Button;

/**
 * Created by Administrator on 2018/5/7.
 */

public class MyDialog extends Dialog {
    public MyDialog(@NonNull Context context) {
//        super(context);//父类的满足子参数形式的构造方法
        super(context,R.style.mydialog);//调用父类的含参构造方法,从而将风格设置到mydialog的样式上面
        setContentView(R.layout.layout);//设置对话框的


        
        //对自定义Dialog中的按钮添加点击事件
        Button yesButton = (Button)findViewById(R.id.btn2);
        Button noButton = (Button)findViewById(R.id.btn1);

        noButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();//控制对话框消失
            }
        });
        yesButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                System.exit(0);
            }
        });
    }
//    //也可以直接重写含两个参数的构造方法,外部传入样式
//    public MyDialog(@NonNull Context context, int themeResId) {
//        super(context, themeResId);
//        setContentView(R.layout.layout);
//    }
    //外部调用时,MyDialog dialog = new MyDialog(this,R.style.mydialog);
    //dialog.show();
}

五、在MainActivity中调用

MainActivity.java

package com.administrator.dialogtest;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button btn1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn = findViewById(R.id.btn1);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn1:
                //1.自定义一个类,继承于Dialog类,在构造方法中调用setContentView(R.layout.xx)来设定对话框的布局
                //2.设定自定义对话框的风格(不显示标题栏,不显示背景),由于继承了Dialog,默认添加了Dialog标题的一栏
                //3.找到res-->values-->styles.xml设置风格
                //4.调用含设定对话框风格参数的构造
                //5.对自定义对话框中的某些控件添加事件
                //6.实例化自定义的对话框,显示
                MyDialog dialog = new MyDialog(this);
                dialog.show();
                break;
        }
    }
}

二、添加适配器案例

新建一个布局array_item_layout.xml作为适配器所引用的资源数据源

array_item_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:orientation="horizontal"
    android:padding="10dp"
    android:gravity="center_vertical">

    <ImageView
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:src="@mipmap/ic_launcher"/>
    <TextView
        android:id="@+id/item_txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="测试"
        android:layout_marginLeft="15dp"/>
</LinearLayout>

在activity_main.xml中添加触发对话框的点击按钮布局

activity_main.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:gravity="center_horizontal"
    android:padding="10dp">
    <Button
        android:id="@+id/btn2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="适配器案例"
        android:onClick="onClick"
        />
</LinearLayout>

Java文件中创建适配器并调用

MainActivity.java

package com.administrator.dialogtest;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private Button btn2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn2 = findViewById(R.id.btn1);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn2:
                showArrayDialog();
                break;
        }
    }

    private void showArrayDialog() {
        final String[] items = {"Java","Mysql","Android","Html","C","JavaScript"};
        //数组适配器
        //参数1:环境
        //参数2:布局资源索引,指的是每一项数据所呈现的样式android.R.layout.xxx
        //参数3:数据源
//        ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,items);

        //参数4:数据源
        //参数3:int textViewId 指定文本数据源需要放在布局中对应id文本控制的位置
        //参数2:布局资源索引
        //参数1:环境
        ArrayAdapter adapter = new ArrayAdapter(this,R.layout.array_item_layout,R.id.item_txt,items);
        AlertDialog.Builder builder = new AlertDialog.Builder(this)
                .setTitle("请选择:")
                //参数1:适配器对象(对数据显示样式的规则制定器)
                //参数2:监听器
                .setAdapter(adapter, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        Toast.makeText(MainActivity.this,items[which],Toast.LENGTH_SHORT).show();
                        dialog.dismiss();//点击后,让对话框消失
                    }
                });
        builder.show();
    }
}

猜你喜欢

转载自blog.csdn.net/weimeig/article/details/80229609