搞Android四年了 自定义dialog布局一直都写不好。。
今天来汇总一下
Activity中用到自定义的dialog
一般情况下
public class BaseDialog extends Dialog { public BaseDialog(Context context) { super(context); } public BaseDialog(Context context, int layout) { super(context); setContentView(layout); } }
public class AppLoading extends BaseDialog { /** * 需要传入一个Activity对象 * * @param context */ public AppLoading(Context context) { super(context, R.layout.app_loading); } }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); AppLoading loading = new AppLoading(getContext()); loading.show(); }
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="200dip" android:layout_height="150dip" android:layout_gravity="center" android:gravity="center" android:orientation="vertical" android:background="@android:color/white" android:padding="10dip"> <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@+id/app_loading_message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dip" android:gravity="center_horizontal" android:text="content"/> </LinearLayout>
---------------------------------------------------------------------------
可以看到对话框的宽度基本上充满屏幕了,然后高度也比内容区的高
网上查了一下解决办法, 然后经过部分代码的重构 整理如下
@Override public void show() { Window win = getWindow(); win.getDecorView().setPadding(0, 0, 0, 0); WindowManager.LayoutParams lp = win.getAttributes(); lp.width = WindowManager.LayoutParams.WRAP_CONTENT; lp.height = WindowManager.LayoutParams.WRAP_CONTENT; win.setAttributes(lp); win.setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); win.setLayout(lp.width, lp.height); super.show(); }
边框的问题基本上解决了
但是除了内容区之外的区域有点黑。。如果不想要背景变黑,则需要设置一下 dialog 的theme
<style name="app_loading_theme" parent="android:Theme.Dialog"> <!-- 是否支持透window明度 --> <item name="android:windowIsTranslucent">true</item> <!-- window背景颜色 --> <item name="android:windowBackground">@android:color/transparent</item> <!-- 屏幕内容区域以外的背景是否可以设置灰度值(与backgroundDimAmount搭配使用) --> <item name="android:backgroundDimEnabled">true</item> <!-- 灰度值 --> <item name="android:backgroundDimAmount">0.2</item> </style>构造方法的时候使用Dialog 的构造方法 public Dialog(Context context, int theme)
public BaseDialog(Context context, int theme, int layout) { super(context, theme); setContentView(layout); }