6- 自定义Dialog
Dialog
非常常见,也是必不可少的UI
,但是系统自带的UI
的确实很多时候不能满足UI
上的要求,功能到时很合适,这时候我们就需要自定义Dialog
了;
自定义dialog
其实是属于自定义继承控件的;
首先自定义一个CustomDialog extends Dialog
public clas View.OnClickListener {
private static final String TAG = CustomDialog.class.getSimpleName();
private int layoutId;
private Context context;
private int[] clickIds;
//实现构造方法,传入layoutId 布局ID,需要实现点击事件的view的clickIds
public CustomDialog(Context context, int layoutId,int[] clickIds) {
super(context, R.style.themeResId);
this.layoutId = layoutId;
this.context = context;
this.clickIds = clickIds;
}
//重写Dialog的onCreat()方法
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Window window = getWindow();
window.setGravity(Gravity.CENTER); // 此处可以设置dialog显示的位置为居中
// window.setWindowAnimations(R.style.bottom_menu_animation); // 添加动画效果
setContentView(layoutId);
//设置Dialog屏幕上的尺寸
WindowManager windowManager = ((Activity) context).getWindowManager();
Display display = windowManager.getDefaultDisplay();
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.width = ViewGroup.LayoutParams.MATCH_PARENT;
lp.height = ViewGroup.LayoutParams.MATCH_PARENT;
// 设置dialog宽度为屏幕的4/5
getWindow().setAttributes(lp);
setCanceledOnTouchOutside(false);//点击外部消失
for (int id : clickIds) {
findViewById(id).setOnClickListener(this);
}
}
//对Dialog上面的某个控件设置文字内容,需要在show()之后调用采用效果
public CustomDialog setViewText(int viewId,String text){
TextView view = (TextView) findViewById(viewId);
Log.e(TAG, "setViewText: "+view );
if(view != null){
view.setText(text);
}
return this;
}
//获得dialog上的某个view
public View getView(int viewId){
View viewById = findViewById(viewId);
return viewById;
}
@Override
public void onClick(View v) {
if(listener != null){
listener.itemClick(v);
}
}
public CustomDialog setListener(DialogItemClickListener listener){
this.listener = listener;
return this;
}
private DialogItemClickListener listener;
public interface DialogItemClickListener{
void itemClick(View view);
}
public CustomDialog showDialog(){
show();
return this;
}
}
/****************************使用方法*************************************/
customDialog = new CustomDialog(this, R.layout.item_dialog_update_apk, new int[]{R.id.cancle, R.id.sure});
customDialog.showDialog() //需要先showDialog出来之后才能设置控件,否则为null
.setViewText(R.id.tv_title, "更新提醒")
.setViewText(R.id.tv_content, apkBreif)
.setListener(this);
/***************************dialog的style1**************************************/
<style name="themeResId" parent="Theme.AppCompat.Dialog">
<item name="android:windowIsFloating">true</item> <!--是否浮在界面上-->
<item name="android:windowIsTranslucent">true</item> <!--是否半透明-->
<item name="android:windowNoTitle">true</item> <!--是否有标题-->
<item name="android:windowBackground">@android:color/transparent</item> <!--窗口背景色透明-->
<item name="android:backgroundDimEnabled">false</item> <!--背景是否模糊显示-->
</style>
/***************************dialog的style2**************************************/
<style name="dialog" parent="@android:style/Theme.Dialog">
//Dialog的windowFrame框为无
<item name="android:windowFrame">@null</item>
//是否浮现在activity之上
<item name="android:windowIsFloating">true</item>
//是否半透明
<item name="android:windowIsTranslucent">true</item>
//是否显示title
<item name="android:windowNoTitle">true</item>
//设置dialog的背景
<item name="android:background">@android:color/transparent</item>
//显示区域背景是否透明
<item name="android:windowBackground">@android:color/transparent</item>
//就是用来控制灰度的值,当为1时,界面除了我们的dialog内容是高亮显示的,dialog以外的区域是黑色的,完全看不到其他内容,系统的默认值是0.5
<item name="android:backgroundDimAmount">0.5</item>
//显示区域以外是否使用黑色半透明背景
<item name="android:backgroundDimEnabled">true</item>
</style>