安卓开发入门8-对话框


AlertDialog

  • 弹个框框确认,提示,警告之类的
image-20210618222346063
  • 要构建一个提示框需要使用Builder,别引错了包
  • 其他API都很直观了,最后show就行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Context context;
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("AKG");
builder.setNegativeButton("取消",null);
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

}
});
builder.show();
//与上面的show等价
// AlertDialog alertDialog = builder.create();
// alertDialog.show();


}
});

第二种方法不太常用

就是直接先create一个alertDialog,然后再设置属性,注意设置按钮的时候不能传null给第三个参数,因为重载的方法都是引用类型。

1
2
3
4
5
6
7
8
AlertDialog alertDialog = new AlertDialog.Builder(this).create();
alertDialog.setButton(Dialog.BUTTON_POSITIVE, "确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {

}
});
alertDialog.show();

自定义对话框

  • 自定义类继承Dialog
1
2
3
4
5
6
7
public class MyDialog extends Dialog {
public MyDialog(@NonNull Context context) {
super(context);
//为对话框设置布局
setContentView(R.layout.dialog);
}
}
  • 布局和其他layout一样写,调用时直接new和show就完事
1
2
MyDialog myDialog = new MyDialog(this);
myDialog.show();

肯定有很多方法可以重写,这里只是一个思路而已

  • 另一种方法,直接设置对应的按钮事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public MyDialog(@NonNull Context context, int themeResId) {
super(context, themeResId);
setContentView(R.layout.dialog);
findViewById(R.id.b1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.exit(0);
}
});
findViewById(R.id.b2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dismiss();
}
});
}
  • 在style.xml中写一个style,传给上面那个构造函数的第二个参数即可
1
2
3
4
<style name="Mydialog" parent="Theme.AppCompat.Dialog">
<item name="windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
image-20210619100759948
  • 有弹出位置和弹出动画可选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public void showPopupWindow(View view) {
//1.实例化对象
//下面这个操作是将布局当做视图处理
//在当前页面中
View v = LayoutInflater.from(this).inflate(R.layout.dialog, null);
PopupWindow popupWindow = new PopupWindow(v, 190, 35, true);
//3.设置背景和动画
//设置背景
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
//设置动画
popupWindow.setAnimationStyle(R.style.anim);
//设置外部响应事件
popupWindow.setOutsideTouchable(true);
//设置能响应自己的点击事件
popupWindow.setTouchable(true);
//添加点击事件
v.findViewById(R.id.ctx_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "ALG", Toast.LENGTH_LONG).show();
}
});
//3.显示
//参数1 anchor锚
//参数2 3 相对于锚的偏移
popupWindow.showAsDropDown(view);

}

PopupWindow动画

  • 在res目录下新建目录anim目录,在这个目录里写动画文件
1
2
3
4
5
6
7
8
9
10
11
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="300"
android:toYDelta="0"

>
</translate>

</set>
  • 在style中引用
1
2
3
4
5
<style name="anim">
<item name="android:windowEnterAnimation">
@anim/translate
</item>
</style>
  • 设置动画只需一行代码
1
popupWindow.setAnimationStyle(R.style.anim);

ArrayAdapter

用来转换数组和textview

image-20210619110709771
1
2
3
4
5
6
7
8
9
10
11
12
public void showArrayDialog(){
String[] array = {"MySQL","Java","C++","Python"};
//数组适配器
//参数1:环境
//参数2:布局资源索引,每一项数据呈现的样式
//参数3:数据源
ArrayAdapter arrayAdapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line);
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("监听器");
builder.setAdapter(arrayAdapter, null);
builder.show();
}
image-20210619112556864
  • 自定义样式,注意如果不指定TextView的id则必须根布局是TextView
  • 设置监听器没啥特别的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void showArrayDialog(){
final String[] array = {"MySQL","Java","C++","Python"};
//数组适配器
//参数1:环境
//参数2:布局资源索引,每一项数据呈现的样式
//参数3:数据源
ArrayAdapter arrayAdapter = new ArrayAdapter(this,R.layout.dialog,R.id.item_text);
AlertDialog.Builder builder = new Builder(this);
builder.setTitle("监听器");
builder.setAdapter(arrayAdapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, array[which], Toast.LENGTH_SHORT).show();
dialog.dismiss();
}
});
builder.show();
}

← Prev 安卓开发入门9-Activity生命周期 | 安卓开发入门7-Menu Next →