原文位址: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 http://www.lxway.com/4054259856.htm