Android进阶之代码应用技巧
Posted 刘兆贤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android进阶之代码应用技巧相关的知识,希望对你有一定的参考价值。
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!
工作中有太多的知识点,不需要死记硬背,但需要灵活运用。本篇主要将这些内容,记录下来,方便自己和他人查阅。
1、为TextView设置方位(上下左右)图片,并修改文字颜色
int friendResource = isOpenFriend ? R.mipmap.icon_open_friend_style : R.mipmap.icon_close_friend_style;
Drawable rightDrawable = getResources().getDrawable(friendResource);
rightDrawable.setBounds(0, 0, rightDrawable.getMinimumWidth(), rightDrawable.getMinimumHeight());
mFriendTv.setCompoundDrawables(null, rightDrawable, null, null);
int color = getResources().getColor(isOpenFriend ? R.color.color_ffff3652 : R.color.color_ffffffff);
mFriendTv.setTextColor(color);
2、为第三方sdk模块设置独立的资源库(res-umc),并让它成为系统认识的资源,即res文件夹再命名
sourceSets
main
res.srcDirs = ['src/main/res', 'src/main/res-umc']
3、开发xml文件时,如何在开发阶段显示属性,在正式版本隐蔽属性,那就用tools方法
tools:text="1"
更多:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0309/2567.html
4、release正式包,不能查看日志,在build文件release的渠道下,添加此行代码,可以在release包下打印log
debuggable true
5、查看apk信息
查看资源信息:
adb shell dumpsys package com.example.test
以下为省略信息:
查看apk某项指标信息(例:versionCode)
adb shell dumpsys package com.example.test | findstr versionCode
查看签名信息:
用压缩包工具打开apk,将META-INFO里的CERT.RSA解压出来
keytool -printcert -file c:\\example.apk
6、drawable与mipmap区别
先看一张图,不同文件夹的图片,都是为了适配!
drawable:用于放置不同分辨率的图片,例:如果在xxhdpi未找到,则到xxxhdpi里去找,接着nodpi->xhdpi->...->ldpi。如果将高分辨率的图片(wrap_conent),放到低分辨率文件夹里,则图片会放大,因此占用内存会变大。
mipmap技术介绍:https://zh.wikipedia.org/wiki/Mipmap
我们可以知道,图片放入mipmap文件夹之后,运行后,会生成“log以2为底,n的对数”个文件,来适配分辨率不同的机型。
建议:logo和需要执行动画的图片,放到mipmap里,通常情况下放市面上比较通用且存量大的xxhdpi图片即可。
区别:在符合适配要求的条件下,从内存角度来看,drawable适合放相对小的图片,mipmap适合放相对大的图片。
两者更深入的介绍,搜到这篇还不错,drawable与mipmap目录
7、getChildFragmentManager与getFragmentManager(同getSupportFragmentManager-v4包下)的区别
前者用于管理子fragment,后者用于管理父(activity)fragment。
如果混用(当前fragment使用前者,子fragment使用后者),则子fragment里再嵌套的fragment内容无法展示(使用transaction的show方法)。
只有使用transaction的replace方法(去掉旧的子fragment,并生成新的子fragment),才可以使用,这样就失去了FragmentManager缓存的意义。
8、代码混淆
minifyEnabled
是混淆开关,配合proguardFiles,使打包后的代码难以阅读,但可使用app/build/mapping/qudao/release目录下,mappings.txt去看混淆文件与未混淆文件的对应,seeds.txt对应未混淆的类和成员。
9、Api23,即6.0(不包括6.0)以下,android.app.Fragment和android.support.v4.app.Fragment里没有getContext方法,调用此方法只会返回空。
10、view.getContext()获得的不一定是activity(context),用下面的方法获得的才是activity(context)
Context context = mRootView.getContext();
if (context instanceof ContextThemeWrapper)
context = ((ContextThemeWrapper) context).getBaseContext();
else if (context instanceof TintContextWrapper)
context = ((TintContextWrapper) context).getBaseContext();
11、VideoView加载不出视频?
设置视频可见即可。
mVideoView.setVisibility(View.VISIBLE);
12、不要在“老机型”上引用“新机型”的Api,否则会报异常:java.lang.NoSuchMethodError
而Build文件信息,会根据你的compileSdkVersion,打入App里。
13、用16进制来表示色彩,一定要加透明度
由于默认透明度是00,全透明,所以不加透明度,色彩不看不到。正常写法:0xffee3322
14、android 4.4模拟器 application java.lang.ClassNotFoundException: Didn't find class
5.0以下,才需要手动设计分包,首先保证使用了MulitiDex,同时保证版本号高于1.0.1或者Application继续MulitiApplication。
15、隐藏导航栏
Activity/Dialog等:
public static void hideNavigationBar(View decorView)
final int flags =
//保持整个View稳定, 常和控制System UI悬浮, 隐藏的Flags共用, 使View不会因为System UI的变化而重新layout
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
//视图延伸至状态栏区域,状态栏上浮于视图之上-去掉之后,可以展示状态栏,但ConsumerListDialog弹出会出现白色背景的状态栏
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
//隐藏状态栏-添加之后
| View.SYSTEM_UI_FLAG_FULLSCREEN
//沉浸模式,隐藏状态栏和导航栏,需要配合View.SYSTEM_UI_FLAG_FULLSCREEN,View.SYSTEM_UI_FLAG_HIDE_NAVIGATION使用(1个或2个均可),
//会清除之前设置的View.SYSTEM_UI_FLAG_FULLSCREEN或View.SYSTEM_UI_FLAG_HIDE_NAVIGATION标志
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
decorView.setSystemUiVisibility(flags);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
decorView.setOnSystemUiVisibilityChangeListener(visibility ->
if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
decorView.setSystemUiVisibility(flags);
);
隐藏PopupWindow:失去焦点即可
mPopupWindow.setFocusable(false);
mPopupWindow.show();
mPopupWindow.setFocusable(true);
16、从服务端下载点九图片,加载到本地失败
原因:安卓打包命令,处理过的点九图片,才有效果,直接下载的无效
办法(1)将点九图片放到安卓项目目录下,运行一遍,取出,扔给服务端;
办法(2)aapt c -S inputDir -C outputDir # inputDir 为原始.9图文件夹,outputDir 为输出文件夹
下载成功后,部署即可:
Bitmap bitmap = BitmapFactory.decodeFile(resource.getPath());
byte[] chunk = bitmap.getNinePatchChunk();
if (NinePatch.isNinePatchChunk(chunk))
NinePatchDrawable npd = new NinePatchDrawable(bitmap, chunk, new Rect(), null);
mUserInfoBg.setBackground(npd);
17、字体描边,通用效果,适用于动态添加图片等复杂场景
android:shadowColor="#C90000"
android:shadowDx="0"
android:shadowDy="2"
android:shadowRadius="3"
18、Json解析后,出现$ref等引用数据。原因是,Json为防止出现连环引用,而导致内存泄露,做了引用。
解决方案是:拒绝做内存(如果源数据有循环引用,会出现内存泄露)、
JSON.toJSONString(list, SerializerFeature.DisableCircularReferenceDetect)
19、禁止录屏,保护隐私
getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE);
https://www.cnblogs.com/qixingchao/p/11652392.html
以上是关于Android进阶之代码应用技巧的主要内容,如果未能解决你的问题,请参考以下文章
Android安卓进阶技巧之Kotlin结合Jetpack构建MVVM