我们有时在一个业务类里面添加一个判断逻辑,需要弹出一个dialog,有事安卓自带的dialog可能无法实现,但是我们可以进行页面跳转,把activity作为dialog弹出来.
如何将activity设置成dialog
修改activity的主题them:
android:theme=”@style/ActivityDialogStyle”
下面是主题的具体操作:
<style name="ActivityDialogStyle" parent="Theme.AppCompat.Light.Dialog">
<!--没有标题-->
<item name="windowNoTitle">true</item>
<!--背景透明-->
<item name="android:windowIsTranslucent">true</item>
<!--是否有覆盖-->
<item name="android:windowContentOverlay">@null</item>
<!--是否浮动-->
<item name="android:windowIsFloating">true</item>
<!--边框-->
<item name="android:windowFrame">@null</item>
<!-- 点击空白部分activity不消失 -->
<item name="android:windowCloseOnTouchOutside">false</item>
<item name="android:windowFullscreen">false</item>
<!--背景:透明-->
<item name="android:windowBackground">@color/transparent</item>
<!--dialog的整个屏幕的背景是否有遮障层-->
<item name="android:backgroundDimEnabled">true</item>
<!--弹出动画-->
<item name="android:windowAnimationStyle">@style/AnimSlideBottom</item>
</style>
AnimSlideBottom是activity出现和消失的动画
<style name="AnimSlideBottom" parent="Animation.AppCompat.Dialog">
<item name="android:windowEnterAnimation">@anim/slide_bottom_in</item>
<item name="android:windowExitAnimation">@anim/slide_bottom_out</item>
</style>
slide_bottom_in.xml
<?xml version="1.0" encoding="utf-8"?>
<translate
android:duration="250"
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="100%"
android:toYDelta="0"
android:fillAfter="true"
xmlns:android="http://schemas.android.com/apk/res/android">
</translate>
slide_bottom_out.xml
<?xml version="1.0" encoding="utf-8"?>
<translate
android:duration="250"
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="0"
android:toYDelta="100%"
android:fillAfter="true"
xmlns:android="http://schemas.android.com/apk/res/android">
</translate>
设置圆角背景(一)
直接在最外层布局上设置background为圆角背景即可.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/prevention_view"
android:layout_width="300dp"
android:layout_height="200dp"
android:gravity="center"
android:paddingLeft="4dp"
android:paddingRight="4dp"
android:background="@drawable/prevention_corners"
android:orientation="horizontal">
<Button
android:layout_margin="10dp"
android:layout_width="100dp"
android:layout_height="130dp"
android:textSize="20sp"
android:gravity="center"
android:text="哈哈"/>
</LinearLayout>
设置圆角背景(二)
也可以在activity设置圆角背景,要在onAttachedToWindow设置,不然获取不到窗口的宽高.使用decorView,设置窗口的背景.
原理请参考实现圆角对话框样式的Activity
@Override
public void onAttachedToWindow() {
super.onAttachedToWindow();
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
View view = getWindow().getDecorView();
WindowManager.LayoutParams lp = (WindowManager.LayoutParams)view.getLayoutParams();
lp.gravity = Gravity.CENTER;
//不设置宽高就是xml布局的宽高
// lp.width = (dm.widthPixels * 4) / 5;
// lp.height = (dm.widthPixels * 4) / 5;
getWindowManager().updateViewLayout(view,lp);
//下面两行代码的顺序不可以改变不然圆角背景就设置不上了
getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
view.setBackgroundResource(R.drawable.prevention_corners);//圆角背景
}
prevention_corners.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFFFFF" />
<corners android:radius="30dp"/>
</shape>
我这两种方式都用了,但是圆角背景都没有展示出来,原因是我们的框架底层为页面加了一层布局,卡在中间,所以我在上层和最底层设置都无效,设置到中间布局上才有效.