前言
最近項目中遇到遇到了把之前的一個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
結束
總結了一下實現的步驟,記錄一下,希望可以幫到他人少踩坑。