Dialog简单布局

发布时间:2026/7/16 3:01:32

Dialog简单布局 序言在使用dialog的时候。由于其默认样式中有宽度的设置还有padding的设置。导致我们设置完布局之后。无法达到预期的效果。于是我研究了怎么能所见即所得的开发dialog的布局实现通过实现了一个DialogLayout 来获取自己的布局参数然后测量自己。同时要设置style。DialogLayoutpackagecom.example.toastdemoimportandroid.content.Contextimportandroid.util.AttributeSetimportandroid.widget.FrameLayoutclassDialogLayoutJvmOverloadsconstructor(context:Context,attrs:AttributeSet?null,defStyleAttr:Int0):FrameLayout(context,attrs,defStyleAttr){// 存储从 XML 解析出的原始宽高值privatevarxmlLayoutWidth0privatevarxmlLayoutHeight0init{// 关键从构造函数的 AttributeSet 中读取因为 inflate(rootnull) 会丢弃 LayoutParamsvaltypedArraycontext.obtainStyledAttributes(attrs,intArrayOf(android.R.attr.layout_width,android.R.attr.layout_height))// 注意getLayoutDimension 能正确处理 -1 (MATCH_PARENT) 和 -2 (WRAP_CONTENT)xmlLayoutWidthtypedArray.getLayoutDimension(0,0)// 0 表示未指定xmlLayoutHeighttypedArray.getLayoutDimension(1,0)typedArray.recycle()}overridefunonMeasure(widthMeasureSpec:Int,heightMeasureSpec:Int){valscreenWidthresources.displayMetrics.widthPixelsvalscreenHeightresources.displayMetrics.heightPixelsvaltargetWidthwhen{xmlLayoutWidth0-xmlLayoutWidth xmlLayoutWidthLayoutParams.MATCH_PARENT-screenWidthelse-screenWidth// 包括 WRAP_CONTENT 或未指定强制全屏}valtargetHeightwhen{xmlLayoutHeight0-xmlLayoutHeight xmlLayoutHeightLayoutParams.MATCH_PARENT-screenHeightelse-screenHeight// 包括 WRAP_CONTENT 或未指定强制全屏}super.onMeasure(MeasureSpec.makeMeasureSpec(targetWidth,MeasureSpec.EXACTLY),MeasureSpec.makeMeasureSpec(targetHeight,MeasureSpec.EXACTLY))}}ClearStyle只需要配置windowIsFloating为true就可以居中显示了。stylenameClearDialogitem nameandroid:windowIsFloatingtrue/item/style原理在phonewindow中如果配置了windowIsFloating 宽高就都是wrap_content就可以使用DialogLayout中计算的值了。使用Dialog布局效果

相关新闻