原文地址:http://www.jianshu.com/p/e588d74b5c9f
这是一个自定义的dialog,可以从屏幕底部弹出
第一步、自定义样式
<!--自定义布局的dialog-->
<style name="MyDialog" parent="android:style/Theme.Dialog">
<!-- 背景颜色及透明程度 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!-- 是否有标题 -->
<item name="android:windowNoTitle">true</item>
<!-- 是否浮现在activity之上,会造成macth_parent失效-->
<item name="android:windowIsFloating">false</item>
<!-- 是否模糊 -->
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowFrame">@null</item>
</style>
第二步、dialog的代码实现,模拟选择图片和拍照2个功能的实现
/**
* 选择图片对话框
*/
public class SelectPicDialog extends Dialog {
public SelectPicDialog(Context context, int themeResId) {
super(context, themeResId);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_select_pic);
ButterKnife.bind(this);
}
@OnClick({R.id.linearlayout_out,R.id.textview_take_photo, R.id.textview_select_photo, R.id.textview_cancal})
public void onClick(View view) {
switch (view.getId()) {
case R.id.textview_take_photo:
if(listener!=null){
listener.onClickTakePhoto();
}
this.cancel();
break;
case R.id.textview_select_photo:
if(listener!=null){
listener.onClickSelectPic();
}
this.cancel();
break;
case R.id.linearlayout_out:
case R.id.textview_cancal:
this.cancel();
break;
}
}
private OnWindowItemClickListener listener;
public void setOnWindowItemClickListener(OnWindowItemClickListener listener) {
this.listener = listener;
}
public interface OnWindowItemClickListener {
void onClickTakePhoto();
void onClickSelectPic();
}
}
第三步、具体的调用
<span style="white-space:pre"> </span>SelectPicDialog dialog = new SelectPicDialog(mContext,R.style.MyDialog);
Window window = dialog.getWindow();
window.setGravity(Gravity.BOTTOM); //此处可以设置dialog显示的位置
window.setWindowAnimations(R.style.mypopwindow_anim_style); //添加动画
dialog.show();
dialog.setOnWindowItemClickListener(new SelectPicDialog.OnWindowItemClickListener(){
@Override
public void onClickTakePhoto() {
startActivityForResult(createCameraIntent(), CREATE_CAMERA); //选择拍照
}
@Override
public void onClickSelectPic() {
startActivityForResult(createPickIntent(), CREATE_PICK); //选择启用系统的选择图片
}
});
1、如果不设置,Dialog默认是Gravity.CENTER。dialog 和popupWindow都有默认的背景,可以通过setBackgroundDrawable(new ColorDrawable(android.R.color.transparent));去掉。
2、AlertDialog是非阻塞式对话框:AlertDialog弹出时,后台还可以做事情;而PopupWindow是阻塞式对话框:PopupWindow弹出时,程序会等待,在PopupWindow退出前,程序一直等待,只有当我们调用了dismiss方法的后,PopupWindow退出,程序才会向下执行。
3、第3方的库 bottomsheet:https://github.com/Flipboard/bottomsheet