背景
关于安卓开发中,有很多奇奇怪怪的问题,有时候这个控件闪一下,有时候这个页面移动一下,这些对于快速开发中,去查询,都是很耗费时间的,因此,本系列文章,旨在记录安卓开发过程中遇到的小问题,能快速解决问题。
开发环境
androidstudio
win10+
gradle4+
本文涉及知识
WebView
微信开放平台
MPAndroidChart
Dialog
PhotoView
gsyVideoPlayer
主体内容
WebView
(1)安卓在使用webview的页面中,进入页面后,webview在初始化中无故滑动。
原因是webview焦点引起的问题。解决方法:在webview的父布局,加上一下属性:
android:descendantFocusability="blocksDescendants"
微信开放平台
(1)微信打开的网页中,点击跳转到安卓APP失效问题,解决方法:
先配置好安卓的微信sdk链接
PS:注意安卓11和安卓13的适配,这里的链接中有。
值得一提的是,如果项目是直接继承三方的wx页面,如友盟的WXCallbackActivity。这个时候我们开发代码的过程,就区别于官方文档了。如果单单是处理微信中的网页跳转到APP指定页面,核心代码如下图:
@Override
public void onReq(BaseReq req) {
LogUtil.d("onReq: " + req.getType());
switch (req.getType()) {
case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
break;
case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
goToShowMsg((ShowMessageFromWX.Req) req);
break;
default:
break;
}
super.onReq(req);
}
从上面的代码中,可以看到,是直接重写onReq方法即可。这里我们在里面处理ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX这个指令就好了。至于sdk中 的extInfo怎样定义,得配合开发过程进行,不能一概而论。
MPAndroidChart(安卓图表库)
(1)折线图,初始化时,移动到指定的x,退出页面,内存泄漏
需要下载源码后,进行修改,修改方法如下:
(1-1)找到MoveViewJob类中的recycleInstance方法,增加下面的代码:
public static void recycleInstance(MoveViewJob instance){
instance.mViewPortHandler = null;
instance.mTrans = null;
instance.view = null;
pool.recycle(instance);
}
(1-2)在调用跳转的过程中,使用方法moveViewToX进行调用即可
(2)取消当前选中的标签
直接调用API
chart.highlightValue(null)
Dialog
(1)通过定义基类的Dialog,进行封装生命周期,便于内存回收释放
很多业务中,都会用到dialog,有些甚至时在dialog里面做很多复杂的操作。
因此,业务中得到dialog的生命周期时非常重要,核心代码如下:
public abstract class BaseCustomDialog extends Dialog {
public BaseCustomDialog(@NonNull Context context, int themeResId) {
super(context, themeResId);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setOnShowListener(new OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
lifecycleStart();
}
});
setOnDismissListener(new OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
lifecycleStop();
}
});
}
protected void initStyle() {
try {
Window window = getWindow();
if (window != null) {
window.getAttributes().windowAnimations = R.style.bottomShowAnimStyle;
WindowManager.LayoutParams lp = window.getAttributes();
lp.dimAmount = 0.1f; // 设置背景透明度(0.0完全透明,1.0完全不透明)
window.setAttributes(lp);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
window.setStatusBarColor(Color.TRANSPARENT); // 设置状态栏颜色
window.setNavigationBarColor(Color.TRANSPARENT); // 设置状态栏颜色
}
} catch (Exception e) {
e.printStackTrace();
}
}
protected void initFullLayout(){
getWindow().getAttributes().width = ViewGroup.LayoutParams.MATCH_PARENT;
getWindow().getAttributes().height = ViewGroup.LayoutParams.MATCH_PARENT;
}
protected void lifecycleStart() {
}
protected void lifecycleStop() {
}
}
上述代码,就是基类dialog的封装,对于子类调用,在方法lifecycleStart(),lifecycleStop()中进行内存的释放管理就可以了。
PhotoView(安卓图片预览控件)
(1)关于PhotoView初始化放大图片逻辑
这里要区分情况,看看你是放大width还是height。这里核心的要点,就是计算出放大的倍数,然后通过setScale方法,进行设计即可。核心代码如下:
ivFhrContent.setScaleLevels(scaleRate / 0.5 > 1 ? 1f : scaleRate / 0.5f, scaleRate, scaleRate * 2);
ivFhrContent.setImageDrawable(resourceImage);
LogUtil.d("scale: " + scaleRate);
new Handler().postDelayed(() -> {
ivFhrContent.setScale(scaleRate,
0f,
ivFhrContent.getHeight() / 2f,
false);
}, 0);
上述代码中,scaleRate就是放大的系数。
gsyVideoPlayer(安卓播放库)
(1)Https证书问题
核心代码如下:
ExoSourceManager.setExoMediaSourceInterceptListener(new ExoMediaSourceInterceptListener() {
@Override
public MediaSource getMediaSource(String dataSource, boolean preview, boolean cacheEnable, boolean isLooping, File cacheDir) {
//如果返回 null,就使用默认的
return null;
}
/**
* 通过自定义的 HttpDataSource ,可以设置自签证书或者忽略证书
* demo 里的 GSYExoHttpDataSourceFactory 使用的是忽略证书
* */
@Override
public HttpDataSource.BaseFactory getHttpDataSourceFactory(String userAgent,
@Nullable TransferListener listener,
int connectTimeoutMillis, int readTimeoutMillis,
boolean allowCrossProtocolRedirects) {
//如果返回 null,就使用默认的
return new GSYExoHttpDataSourceFactory(userAgent, listener,
connectTimeoutMillis,
readTimeoutMillis, true);
}
});
上述设置,可以接受重定向以及播放HTTPS数据