前言
最近项目中遇到遇到了把之前的一个activity的以dialog的形式弹出,以减少代码的改动。参考了很多方法,最终实现此功能,记录一下。
正文
具体步骤:
- 在style文件中增加activity的样式
<!-- 类似对话框效果 -->
<style name="MyDialogTopRight" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:backgroundDimEnabled">true</item>
<item name="android:windowAnimationStyle">@style/Anim_scale</item>
</style>
<style name="Anim_scale" parent="@android:style/Animation.Activity">
<item name="android:activityOpenEnterAnimation">@anim/scale_in</item>
<item name="android:activityOpenExitAnimation">@anim/scale_out</item>
<item name="android:activityCloseEnterAnimation">@anim/scale_in</item>
<item name="android:activityCloseExitAnimation">@anim/scale_out</item>
</style>
parent=“Theme.AppCompat.Light.NoActionBar”,如果需要显示的dialog没有标题,需要这样写,否则会显示标题头。
新增进入和退出的动画:
进入动画:scale_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
android:fromXScale="1.0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toXScale="1.0"
android:fromYScale="0.0"
android:toYScale="1.0"
android:duration="200"
android:pivotX="0"
android:pivotY="10%"
/>
</set>
退出动画:scale_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
android:fromXScale="1.0"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:toXScale="1.0"
android:fromYScale="1.0"
android:toYScale="0.0"
android:duration="200"
android:pivotX="0"
android:pivotY="10%"
/>
</set>
2.只要在对应的activity的使用就可以了,使用的方式有两种
方式1:在清单文件中引入,这个方法适用于静态的改变主题
android:theme="android:theme="@style/MyDialogTopRight"/>
方式2:动态的在activity中设置
网上有很多说在onCreate()方法中设置,巴拉巴拉…,但是对于我这边是不可以,对于我有效的方案如下:
1.需要修改清单文件的主题为:注意⚠️:必须增加这个theme,否则动态修改不生效
android:theme="@android:style/Theme.Translucent.NoTitleBar"
2.重写setTheme方法,在需要修改的主题的时候修改给你自定义的主题即可
@Override
public void setTheme(int resid) {
if (isChange){
super.setTheme(R.style.MyDialogTopRight);
}else {
super.setTheme(resid);
}
}
3.如果想给弹出的对话框修改背景为圆角,需要设置
@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;
getWindowManager().updateViewLayout(view,lp);
//下面两行代码的顺序不可以改变不然圆角背景就设置不上了
getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
view.setBackgroundResource(R.drawable.shape_authrize_dialog);//圆角背景
}
END
结束
总结了一下实现的步骤,记录一下,希望可以帮到他人少踩坑。