天天看点

Android工作学习收集整理(六月)

  • 目前市面上的版本控制工具,主要为集中式版本控制工具(以SVN为代表)和分布式版本控制工具(当然是git了)。
    • 集中式:一个中央服务器控制所有的版本管理,如果中央服务器因为各种原因被毁,那么整个项目的版本控制就完蛋了。而且,不论是提交还是更新,都需要不段的跟服务器进行通信,没有网络就完蛋。容灾性差,通信频繁。
    • 分布式:终端可以获取中央服务器的完整信息,就像做了一个完成的镜像。git操作可以全部发生在本地,只需要最终完成后提交服务器就好了,不需要频繁的通信。
  • 自定义环形统计view
    开始用drawArc根据角度绘制圆环,因为设计图上每两个统计区域有一小段白色间隔,如果圆环的厚度小的话看不出来,当达到一定的厚度,间隔的角度也就出来了,给人感觉不好,后来只好换成drawpath画内圆和外圆覆盖实现,效果不错。
  • 两个EditText相互监听(TextWatcher),会造成死循环。解决办法:添加标志位控制,标志是否被编辑。
  • instant run
    • 增加编译调试的速度
    • 开启该功能后,AndroidStudio将以插件补丁的形式更新app,也就是说,只将程序修改的地方部署到手机上。
    • hot swap:修改代码方法里的东西,一般指是某个方法里修改了。
    • warm swap:修改或删除资源文件。
    • cold swap:比较慢,一般是修改比较多的内容,打包成新的dex文件发送手机上。
    • Android Studio会根据代码的修改情况自动选择使用哪种swap类型
  • Android TextView.Html.fromHtml() “span”标签不支持。
    Android TextView 支持的HTML标签
  • 百度地图开发过程中,发现不同的电脑,同一个项目,跑出的sha1不一样。
  • drawText 可以计算内容的宽度:用Rect计算宽度
Rect bounds = new Rect(); 
    mbPaint.getTextBounds(textString, , textString.length(), bounds);
    textWidth = bounds.right-bounds.left;
           
  • 百度地图开发中遇到这样一个问题:Fragment1中有地图,Fragment2中也有地图,从fragment1中跳到fragment2中,这是会出现fragment1中的地图覆盖在fragment2中的地图上,且没有点击和触摸事件。
    • 这个压盖问题,是系统GLSurfaceView本身的问题,用两个GLSurfaceView实验也是这样
    • 解决方案:百度地图新增了TextureMapView可以解决,这是android4.0以上给的解决方案,最好的话开启硬件加速的权限,否则用户切换过快的话,可能会出现一些问题。TextureMapView还可以解决MapView在滑动过程中出现黑边的问题。
  • ScrollView的滚动监听事件不适用于低版本api(低于23),使用自定义View继承自ScrollView,重写onScrollChanged方法,通过接口将参数传出去。
  • 在PC版本的QQ上可能只看到一条连接,因为PC版本的QQ只会对其白名单的连接作截图,如果不在此名单中,则只是显示连接而已。
  • UserAgent
    • 用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA
    • 通过这个标识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者信息统计。例如用手机访问谷歌和电脑访问是不一样的,这些就是谷歌根据访问者的UA来判断的。
    • Android对webview的User-Agent设置:正常是系统UA+自定义的一些相关信息
WebSettings settings = webview.getSettings(); 
    //添加UA,  “app/XXX”:是与h5商量好的标识,h5确认UA为app/XXX就认为该请求的终端为App    
    settings.setUserAgentString(settings.getUserAgentString()+"app/XXX");
    settings.setJavaScriptEnabled(true);    
    //设置参数    
    settings.setBuiltInZoomControls(true);    
    settings.setAppCacheEnabled(true);// 设置缓存    
    webview.setWebChromeClient(new WebChromeClient());    
    webview.loadUrl(loadurl);  
           
  • Fragmentation框架中,WebView 按返回键 变空白?
    • fragment返回的时候,onDestroy里先调用了Webview的onDestroy方法,webview已经被销毁,此时退出动画还没有结束,webview已经destory了,所以会出现白屏。
    • 解决办法:换成WebviewActivity
    • 换成Activity也不行,相当于新建了一个Fragment栈,这个时候启动原来的栈内fragment只会在MainActivity的那个栈内启动,最后结果就是Fragment在WebviewActivity下面。
    • 只有等退出动画结束才去销毁webview 或者 移除退出动画。
    • 移除退出动画效果也不理想,还是会闪一下白屏。
    • 最终解决办法:监听动画退出
@Override
    public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) {
        Animation animation = super.onCreateAnimation(transit, enter, nextAnim);
        animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }

            @Override
            public void onAnimationEnd(Animation animation) {
                // 解决直接在onDestroy里销毁webview白屏的问题
                if (isDestroy) {
                    // {...} 销毁webview代码
                    isDestroy = false;
                }
            }

            @Override
            public void onAnimationRepeat(Animation animation) {
            }
        });
        return animation;
    }
           
  • getDimension,getDimensionPixelOffset()和getDimensionPixelSize() 区别, 相同单位下比较,只是返回结果数值不同,其结果只是浮点数,截取的区别
    • getDimension: 返回float
    • getDimensionPixelOffset:返回的int型,将结果强转成int,小数直接截取,不是四舍五入。
    • getDimensionPixelSize:返回的int型,将结果强转成int,小数四舍五入。
  • 今日头条技术团队 一种极低成本的Android屏幕适配方式
    关于带有EditText的popupWindow总结。
    • 首先是在Android7.0上面,显示异常问题,在Android7.0上设置popupwindow在某个View下面弹出,结果却跑到了最顶端。解决这个问题比较常见的两个方法。
// 方法一:这个方法正常显示没有问题,如果里面含有Edittext,弹出软键盘就不行了,你会发现弹出软键盘的时候,还是将Popupwindow顶到最上面。这个时候就需要第二种解决办法
    Rect rect = new Rect();
    anchor.getGlobalVisibleRect(rect);
    mHeight = anchor.getResources().getDisplayMetrics().heightPixels - rect.bottom;
    setHeight(mHeight);
    super.showAsDropDown(anchor);
    //方法二:这个针对Android  api24进行处理,代码如下
    int[] a = new int[];
    anchor.getLocationInWindow(a);
    // 算上点击View的高度才行
    int heignt = anchor.getHeight();
    this.showAtLocation(mActivity.getWindow().getDecorView(), Gravity.NO_GRAVITY, , a[]+heignt);
    this.update();
           
  • 弹出软键盘遮挡EditText的问题,开始根据网上资料设置
setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED);
    setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
           

发现并没有乱用,最终解决办法还是监听软键盘的弹出设置底部EditText的topMargin。当然这里要使用popupwindow的update动态改变popupwindow的高度。这里要计算好topmargin的高度。

  • 关于PopupWindow弹出背景变半透明。网上一大堆文章都是说弹出Popupwindow让整个背景都半透明,这样体验很差,我只需要下拉的时候,下面半透明就好了。这里的解决办法是让整个Popupwindow的高度充满屏幕。最外层布局是个FrameLayout,宽高都是match_parent,背景为半透明,然后popupwindow的具体内容addView进去。设置poupwindow进入动画的同时设置frameLayout的背景透明度从0f到1f。
  • 这个时候你会发现点击下面半透明popupwindow并没有消失,这是因为你点击的还是Popupwindow,这个时候我们可以添加一个透明View在下面,然后监听透明View的点击事件就可以了。