弹窗是图形界面必备的一个模块, 回忆一下windows那些恶心爆了的错误弹窗吧, 把弹窗制作的更高效友好一点是非常必要的. 这里说两个常用的弹窗类, PopupWindow和AlertDialog. 我的理解就是, PopupWindow较为随性, 可以在任意位置弹窗, 比如你经常看到的朋友圈点赞的那个小的弹窗. 那AlertDialog就很正经了, 位置固定在中央, 比如无比烦人的更新提示就是用的它, 大多数都是消息标题+内容+确定按钮+取消按钮. 好, 不多废话了.
为了保护你的眼睛, 图片已处理
先来看一段常规的PopupWindow的使用, 然后逐行分析下.
PopupWindow popupWindow = new PopupWindow();
popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setContentView(View.inflate(this, R.layout.layout_popup, null));
popupWindow.setBackgroundDrawable(new ColorDrawable(0x00000000));
popupWindow.setFocusable(true);
popupWindow.setOutsideTouchable(false);
popupWindow.setAnimationStyle(R.style.anim_menu_bottombar);
popupWindow.showAsDropDown(bt_popup, 0, 0);
解析:
popupWindow.setBackgroundDrawable(new ColorDrawable(0x00000000));
这个很有意思. 在高版本的android中(比如8.0), 实测可以不写, 但是低版本就不行了(比如4.1), 低版本不写的话, 会导致点击返回或者是屏幕其它地方无法取消弹窗, 所以稳妥起见还是加上, 并设置一个透明色.popupWindow.setFocusable(true);
是比较重要的, 一般都为true, 也就是弹窗之后, 焦点就到了弹窗, 你再点击其它地方, 弹窗失去焦点就会消失. popupWindow.setOutsideTouchable(false);
这句在之前那句为true的前提下, true和false效果几乎一样.效果图
RelativeLayout rl_content = (RelativeLayout) findViewById(R.id.rl_content);
popupWindow.showAtLocation(rl_content, Gravity.CENTER, 0, 0);
补充:
解析:
compile 'com.android.support:appcompat-v7:25.3.1'
, 版本要确保大于22, 因为22中引入了Material Design风格的Dialog(5.0引入的Material Design), 当然, 如果你用Android Studio, 这点基本无需担心.dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}
android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(this);
AlertDialog.Builder builder = new AlertDialog.Builder(this);
右侧是Material Design风格
android.support.v7.app.AlertDialog.Builder builder = new android.support.v7.app.AlertDialog.Builder(this);
builder.setIcon(R.mipmap.ic_launcher);
builder.setTitle("title");
builder.setMessage("message");
builder.setPositiveButton("positive", null);
builder.setNegativeButton("negative", null);
builder.setNeutralButton("neutral", null);
builder.setCancelable(true);
android.support.v7.app.AlertDialog dialog = builder.create();
dialog.show();
举个栗子
setPositiveButton
等函数第二个参数其实是监听器, 你可以如下操作.builder.setPositiveButton("positive", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(getApplicationContext(), "positive", Toast.LENGTH_SHORT).show();
}
});
builder.setCancelable(true);
就是意思点击弹窗以外的部分可以取消弹窗, 设置false则不取消弹窗, 按需设置啦.builder.setMessage("message");
和设置单选多选条目不能同时存在. 下方展示代码和效果图. 当然了, 监听我都没写, 按需求自己完成啦.builder.setItems(new String[]{"1", "2", "3"}, null);
builder.setSingleChoiceItems(new String[]{"1", "2", "3"}, 2, null); //数字对应默认选中, 从0开始
builder.setMultiChoiceItems(new String[]{"1", "2", "3"}, new boolean[]{true, true, false}, null); //boolean数组对应勾选
普通条目展示
单选多选条目展示
补充:
举个栗子
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<EditText
android:id="@+id/et_account"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:ignore="TextFields" />
<EditText
android:id="@+id/et_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/et_account"
tools:ignore="TextFields" />
<Button
android:id="@+id/bt_cancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@id/et_password"
android:text="@string/bt_cancel"
tools:ignore="RtlHardcoded" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/et_password"
android:layout_toLeftOf="@id/bt_cancel"
android:text="@string/bt_login"
tools:ignore="RtlHardcoded" />
</RelativeLayout>
builder.setMessage("message");
共存, 但事实上, 好像没有这个必要, 我故意把一些非自定义的也展示出来, 其实自定义View完全可以全部自己写.builder.setView(View.inflate(this, R.layout.layout_login, null));
喜欢记得点个赞了, 有意见或者建议可以评论区见哦, 当然啦, 暗中关注我也是可以的.