整理關於activity以dialog的形式彈出

整理activity以dialog的形式彈出

前言

最近項目中遇到遇到了把之前的一個activity的以dialog的形式彈出,以減少代碼的改動。參考了很多方法,最終實現此功能,記錄一下。

正文

具體步驟:

  1. 在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

結束

總結了一下實現的步驟,記錄一下,希望可以幫到他人少踩坑。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章