天天看點

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的點選事件就可以了。