一. AlertDialog
对话提示框,通常是在某项操作触发下显示的控件,需要在代码中调用show方法进行展现。AlertDialog的构造方法是protected,所以不能直接创建,有以下两种方式来创建:
创建方式
- 通过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();
- 通过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
- 设置布局
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>
- 将布局添加到自定义对话框中,设置监听
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();
}
});
}
}
- 设置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>
- 建立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。
创建方式
- 跟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;
}
- 重载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;
}
- 使用
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中定义回调接口
- 定义回调接口
private Callback callback;
public interface Callback{
void onPhoto();
void onCamera();
}
public void setCallback(Callback callback) {
this.callback = callback;
}
- 添加回调事件
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();
- 使用
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>