一、自定义对话框
实现步骤:
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(); } }