背景介绍: APP内部版本更新提醒使用了 Bugly
的 crashreport_upgrade
项目. 由于默认的更新弹窗 UI
样式跟APP的风格差距太大.于是有了自定义UI的需求, 官方提供有2种自定义UI的方式, 一种是通过自定义布局文件然后对相应控件加 tag
的方式实现. 一种是通过自定义 Activity
方式实现.由于我的需求没有那么复杂, 所以使用的是第一种自定义UI的方式.
最终效果图:
实现方式简单写一下.
第一个坑, 弹窗顶部的 banner
或者说 logo
与下面的版本信息之间有一根线分割, 因为粗心大意把
写成了
, 所以报了一个很奇怪的 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
shape_text_primary_bg.xml
splash_btn_bg_primary.xml
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(){
@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
)在问, 但是目前还是没有人回复我这个问题.