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

Android高手进阶教程之----Android 中自定义View的应用.

Android安卓进阶技巧之全局自定义字体的实现

C语言数字图像处理进阶---3连环画风格滤镜

C语言数字图像处理进阶---3连环画风格滤镜

C语言数字图像处理进阶---3连环画风格滤镜