背景介绍: APP内部版本更新提醒使用了 Bugly
的 crashreport_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
设置上字体颜色后就没有这个问题了.
第四个坑 顶部 banner
在 1.3.5
版本后就不显示了##
我使用的弹窗样式是第二种:
这个顶部的 banner
图在 SDK 1.3.5
版本以下是没有问题的, 但是我发现在 1.3.6
, 1.3.7
版本后这个 bannner
图就不显示了. 这个问题我至今没有解决. 加了官方QQ群(429975901
)在问, 但是目前还是没有人回复我这个问题.