背景介绍: APP内部版本更新提醒使用了 Buglycrashreport_upgrade 项目. 由于默认的更新弹窗 UI 样式跟APP的风格差距太大.于是有了自定义UI的需求, 官方提供有2种自定义UI的方式, 一种是通过自定义布局文件然后对相应控件加 tag 的方式实现. 一种是通过自定义 Activity 方式实现.由于我的需求没有那么复杂, 所以使用的是第一种自定义UI的方式.

最终效果图:

实现方式简单写一下.

首先自定义布局文件, 第一个坑

第一个坑, 弹窗顶部的 banner 或者说 logo 与下面的版本信息之间有一根线分割, 因为粗心大意把 <View> 写成了 <view>, 所以报了一个很奇怪的 bug,如下:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.xxx.xxx/com.tencent.bugly.beta.ui.BetaActivity}: android.view.InflateException: Binary XML file line #36: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2837)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2898)
        at android.app.ActivityThread.-wrap12(ActivityThread.java)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1619)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6349)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
     Caused by: android.view.InflateException: Binary XML file line #36: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:761)
        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727) 

排查了半小时才发现这个问题的原因. 对自己无语o(゚Д゚)っ!

upgrade_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:background="#33000000"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/white_radius_btn"
        android:orientation="vertical"
        android:layout_centerInParent="true"
        android:layout_marginStart="45dp"
        android:layout_marginEnd="45dp"
        >

        <ImageView
            android:id="@+id/beta_upgrade_banner"
            android:layout_width="match_parent"
            android:layout_height="80dp"
            android:scaleType="centerCrop"
            android:tag="beta_upgrade_banner"
            android:layout_marginTop="15dp"/>

        <TextView
            android:id="@+id/beta_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="15dp"
            android:tag="beta_title"
            android:text=""
            android:visibility="gone"
            />

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="@color/dividing_line"
            />

        <TextView
            android:id="@+id/beta_upgrade_info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="30dp"
            android:layout_marginTop="15dp"
            android:layout_marginEnd="20dp"
            android:layout_marginBottom="15dp"
            android:tag="beta_upgrade_info"
            android:text=""
            android:enabled="false"
            android:textColor="@color/colorBlackFont"
            />

        <TextView
            android:id="@+id/beta_upgrade_feature"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:layout_marginStart="30dp"
            android:layout_marginEnd="20dp"
            android:layout_marginBottom="15dp"
            android:tag="beta_upgrade_feature"
            android:text=""
            android:enabled="false"
            android:textColor="@color/colorBlackFont"
            />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="15dp"
            android:orientation="horizontal">

            <Button
                android:id="@+id/beta_cancel_button"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:minHeight="35dp"
                android:layout_marginStart="15dp"
                android:layout_marginEnd="0dp"
                android:layout_weight="1"
                android:background="@drawable/shape_text_primary_bg"
                android:tag="beta_cancel_button"
                android:text="@string/remind_later"
                android:textColor="@color/colorPrimary"
                />

            <Button
                android:id="@+id/beta_confirm_button"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:minHeight="35dp"
                android:layout_marginStart="15dp"
                android:layout_marginEnd="15dp"
                android:layout_weight="1"
                android:textColor="@color/colorWhite"
                android:background="@drawable/splash_btn_bg_primary"
                android:tag="beta_confirm_button"
                android:text="@string/update_immediately"
                />
        </LinearLayout>
    </LinearLayout>

</RelativeLayout>

shape_text_primary_bg.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <corners android:radius="3dp"/>
    <stroke android:color="@color/colorPrimary" android:width="0.5dp"/>
</shape>

splash_btn_bg_primary.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
    <corners android:radius="5dp"/>
    <solid android:color="@color/colorPrimary"/>
</shape>

Bugly 初始化之前指定布局id, 第二个坑

第一个坑, 弹出的弹窗使状态栏变成黑色, 我项目里状态栏是透明的, 导致很难看, 应该是因为官方的 BetaActivity 没有处理, 于是我设置监听在 onCreate 时改变了状态栏.

// bugly延迟3秒初始化
Beta.initDelay = 3 * 1000;
// 指定自定义布局id
Beta.upgradeDialogLayoutId = R.layout.upgrade_dialog;
// 指定升级弹窗只能在主页弹出
Beta.canShowUpgradeActs.add(MainActivity.class);
Beta.upgradeDialogLifecycleListener = new UILifecycleListener<UpgradeInfo>(){

        @Override
        public void onCreate(Context context, View view, UpgradeInfo upgradeInfo) {
            // 解决弹窗时状态栏为黑色的问题. 
            if (context instanceof com.tencent.bugly.beta.ui.BetaActivity) {
                com.tencent.bugly.beta.ui.BetaActivity betaActivity = (com.tencent.bugly.beta.ui.BetaActivity)context;
                Window window = betaActivity.getWindow();
                window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            }
        }

        @Override
        public void onStart(Context context, View view, UpgradeInfo upgradeInfo) {

        }

        @Override
        public void onResume(Context context, View view, UpgradeInfo upgradeInfo) {

        }

        @Override
        public void onPause(Context context, View view, UpgradeInfo upgradeInfo) {

        }

        @Override
        public void onStop(Context context, View view, UpgradeInfo upgradeInfo) {

        }

        @Override
        public void onDestroy(Context context, View view, UpgradeInfo upgradeInfo) {

        }
    };

第三个坑 更新版本信息的文字是灰色的

更新版本信息的文字是灰色的, 一触摸到弹窗后又变为黑色的, 手放开又恢复为灰色的?
这个问题的原因是因为没有为字体设置颜色. 后来我把 TextView 设置上字体颜色后就没有这个问题了.

第四个坑 顶部 banner1.3.5 版本后就不显示了

我使用的弹窗样式是第二种:

这个顶部的 banner 图在 SDK 1.3.5 版本以下是没有问题的, 但是我发现在 1.3.6, 1.3.7 版本后这个 bannner 图就不显示了. 这个问题我至今没有解决. 加了官方QQ群(429975901)在问, 但是目前还是没有人回复我这个问题.