天天看點

Android 雜知識總結

在開發中,總會遇到各種不可名狀的問題。限于不同時期對知識點的認識與熟悉度,問題的難度及掌握度也因人而異。

以下是我在日常開發中所遇到的一些問題及解決方案。(可能有些方面解釋不全面或有失偏頗,望多多指出,全文解決方案僅供參考。)

1.Android 元件通過java代碼設定間距

Android 雜知識總結

2.擷取系統attr的值

int defaultColor = 0xFF000000;  
	int[] attrsArray = { andorid.r.attr.colorAccent };  
	TypedArray typedArray = context.obtainStyledAttributes(attrsArray);  
	int accentColor = typedArray.getColor(0, defaultColor);  
	  
	// don't forget the resource recycling  
	typedArray.recycle();  
           

3.getResources().getColor()方法過時

ContextCompat.getColor(Context context, int id);
           

改用以上擷取方法。

4.使用fresco顯示不了預設圖檔

原因在于未引入相應的命名空間

xmlns:fresco="http://schemas.android.com/apk/res-auto"
           

另外注意:使用Glide去加載SimpleDraweeView時,SimpleDraweeView即便設定了圓角也無效。(可能兩者有沖突吧)

5.   -0.01 != -0.01f

同樣0.01 !=0.01f

(在做資料判斷時,容易出現認為上述兩者是相等的誤判)

6.ImageView使用fit_start屬性後,會有一片空白而不能占滿父布局

在java代碼中設定:

imageView.setAdjustViewBounds(true);
           

7.如何将TextView顯示在圖檔的中間

放在FrameLayout父布局中,然後子布局中使用layout_gravity=”center”。在布局編輯器中是在圖檔下面顯示的,但是在真機上是顯示在中央的。

8.setResult要在finish之前調用

這個是源碼規定的(即使在onDestroy方法中的super.onDestroy()方法前setResult也是不行的)。

參考位址:點選打開連結

9.輸入框兩位小數限制

//使用處
edittext.setFilters(new InputFilter[]{InputFilterUtil.getTwoDecimalFilter()});
           
/**
 * 限制兩位小數輸入
 * @return
 */
public static InputFilter getTwoDecimalFilter(){
    InputFilter inputFilter = new InputFilter() {
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            if("".equals(source.toString())){
                return null;
            }
            String dValue = dest.toString();
            String[] splitArray = dValue.split("\\.");
            if(splitArray.length > 1){
                String dotValue = splitArray[1];
                int diff = dotValue.length() + 1 - 2;
                if(diff > 0){
                    return source.subSequence(start, end - diff);
                }
            }
            return null;
        }
    };
    return inputFilter;
}
           

10.平移動畫效果被元件遮擋

做一個平移動畫時,元件移動過程中被其他元件擋住。

android:clipChildren="false"
           

要在父布局中設定這個屬性,且有可能需要在祖父布局中頁設定這個屬性——>關鍵看需要把動畫傳遞到哪個位置的布局中(網上的一些案例沒有注意這點,是以很多時候麼效果)

11.TabLayout如何改間距

沒發現直接對應的屬性:直接改的height,會自動縮放間距比例。

12.Fragment與ViewPager相關

a.懶加載:需要的時候再加載(切換到這個Fragment的時候再去加載)

參考:http://www.cnblogs.com/dasusu/p/5926731.html

b.ViewPager與Fragment配合使用時:

1.setUserVisibleHint 先于onAttach調用;

2.onAttach如果已經是attached狀态,則不會走進這個生命周期;

3.setUserVisibleHint(boolean isVisibleToUser)傳回傳遞的參數是表示該fragment是否可見;

4.今日頭條的預加載也是臨近的兩個pager才進行,始終保持3個pager的運作,隻不過首先是從記憶體中取出資料然後結合上次重新整理的時間決定是否請求忘了加載資料。

13.BottomNavigationBar使用報錯

Android 雜知識總結

使用這個元件後,要求allowBackup=true,改為false後就出現上面的問題了,按照上面的解釋,在<application>标簽中加入;tools:replace="android:allowBackup" 就可以了。——>啟示:很多時候的錯誤,IDE已經給出解決方案了,首先按照IDE的說明去做而不是直接去網上查找,這樣效率來得快得多(對問題的掌握度也更好一些)。

14.RelativeLayout中子布局顯示不出來

Android 雜知識總結

BottomNavigationBar先放在前面然後在FrameLayout中使用layout_above 是表示:先固定好BottomNavigationBar的位置,然後将FrameLayout放在其上面;

如果相反,先把FrameLayout 放在上面,然後BottomNavigationBar中使用layout_below表示,則當FrameLayout中是清單時,則無法在螢幕顯示出BottomNavigationBar了。

是以——>RelativeLayout中子view的順序很重要!

15.android 6.0動态權限申請

https://github.com/googlesamples/easypermissions

16.Java中使用正規表達式擷取網頁中所有圖檔的路徑

public static String [] returnImageUrlsFromHtml() {
    List<String> imageSrcList = new ArrayList<String>();
    String htmlCode = returnExampleHtml();
    Pattern p = Pattern.compile("<img\\b[^>]*\\bsrc\\b\\s*=\\s*('|\")?([^'\"\n\r\f>]+(\\.jpg|\\.bmp|\\.eps|\\.gif|\\.mif|\\.miff|\\.png|\\.tif|\\.tiff|\\.svg|\\.wmf|\\.jpe|\\.jpeg|\\.dib|\\.ico|\\.tga|\\.cut|\\.pic)\\b)[^>]*>", Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher(htmlCode);
    String quote = null;
    String src = null;
    while (m.find()) {
        quote = m.group(1);
        src = (quote == null || quote.trim().length() == 0) ? m.group(2).split("//s+")[0] : m.group(2);
        imageSrcList.add(src);
    }
    
    return imageSrcList.toArray(new String[imageSrcList.size()]);
}
           

參考位址:http://www.cnblogs.com/interdrp/p/4944648.html

17.擷取的sd是不是自己買來插入到手機的sd卡

摘:對于現在市面上很多Android裝置,自帶了一個大的存儲空間,一般是8GB或16GB,并且又支援了Sdcard擴充,對于這樣的裝置,使用Enviroment.getExternalStorageDirectory()方法隻能擷取到裝置自帶的存儲空間,對于另外擴充的Sdcard而言,需要修改路徑。

也就是:系統也存在sdcard ,一般代碼隻能擷取裝置自帶的這個sdcard,而不能擷取使用者手動插入的sdcard(這個為外置SD卡)。

18.Java中字元串使用split的分割

以“-”之類的進行分割,若“-”是第一位,則分割出來的數組第一位是為空;

直白點就是:假如有字元串"-ab",以"-"作為分割符,則分割出來是數組是 ["","ab"]。

19.ImageButton使用Selector無效果

ImageView使用倒是可以(哈哈,有點扯了)

20.selector實作選中button選中樣式的變化

一般是state_pressed起作用,但隻是瞬間的變化,想要長久的保持狀态,目前是通過資料邏輯來控制的;

Android 雜知識總結

右下角的選中圖示通過和button在FrameLayout中疊加實作;

21.如何修改系統自帶的回退icon的大小

a. 改變icon的圖檔資源大小;

b.Dimen檔案下覆寫相關屬性

<dimen name="design_navigation_icon_size">48dp</dimen>                <dimen name="design_navigation_icon_size">48dp</dimen>      

這樣系統在調用的時候就會使用這個覆寫的值.

參考位址:http://stackoverflow.com/questions/32179258/how-to-change-the-size-of-menu-item-icon-in-navigationview/34082280#34082280

22.RatingBar設定0dp,weight這樣的組合的話,num會随着長度而變化而不受numStars屬性的控制

23.Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug'.

> com.android.build.api.transform.TransformException:java.util.zip.ZipException: duplicate entry: okio/AsyncTimeout$1.class

意思是不同的jar包引入了同樣的類,是以沖突了:

一般來說就是删除依賴和jar包,但是既然是一同引入的,這樣删除可能是有問題的;

參考位址:

http://stackoverflow.com/questions/26966843/java-util-zip-zipexception-duplicate-entry-during-packagealldebugclassesformult

http://stackoverflow.com/questions/30769483/error-java-util-zip-zipexception-duplicate-entry

http://blog.csdn.net/ly137387869/article/details/50510474

http://blog.csdn.net/jinjins1129/article/details/51014303

24.計算流的MD5值

http://www.oschina.net/code/snippet_230123_22951

25.read(byte b[])  與 read()的差別

後者是每次讀一個位元組,這也就導緻對于中文(兩個位元組)的讀的過程中就出現亂碼;

http://blog.csdn.net/snihcel/article/details/7893097

前者效率比後者高:

https://segmentfault.com/q/1010000003798281/a-1020000003798562

byte[] buffer = new byte[1024]; 
int len = 0;
 while ((len = inputStream.read(buffer)) != -1) {
    fileoutputstream.write(buffer,0,len);
}
           

這個是正确的寫法:表示将得到的輸入流轉換到檔案輸出流中去(儲存至檔案);

我在操作過程中沒搞清楚這幾個流的關系,導緻寫出了以下的錯誤代碼:

byte[] buffer = new byte[1024]; 
int len = 0;
 while ((len = inputStream.read(buffer)) != -1) {
fileoutputstream.write(buffer);
//fileoutputstream.write(len);
}
           

以上兩種輸出流之是以會寫出這樣的心态,是沒有了解參數的意義:buffer表示緩存數組,len表示讀取的長度

 void write(byte[] b) : 将 b.length 個位元組從指定位元組數組寫入此檔案輸出流中。 

 void write(byte[] b, int off, int len) : 将指定位元組數組中從偏移量 off 開始的 len 個位元組寫入此檔案輸出流。 

 void write(int b) :        将指定位元組寫入此檔案輸出流。 

如果使用第一種,則會出現,最後得到的輸出流檔案的大小大于輸入流檔案的大小,因為每次讀取的是b.length的長度(這個長度是在初始化的1024或者其他什麼書,在讀的過程中配置設定的空間很可能是沒有被完全占滿的——>導緻也一并被讀入到了輸出流中);

而使用第二種就不用擔心上面的情況,因為這個就好比按勞配置設定,有多少資料就讀多少,不會占用無用的資源。

26.使用SimpleDrawWeeView時加載本地圖檔不出來

simpleDrawee.setImageURI(Uri.parse("file://" + file.getAbsolutePath()));
           

是要構造“ file://”這樣的字首;

Android 雜知識總結

參考:http://blog.csdn.net/wang8651971/article/details/45625705

27.使用ViewPager來删除某一頁

不僅要使adapter中的資料删除,而且也要使用ViewPager來删除目前的頁面 : Viewpager.removeview(**)

另外還要在getItemPostion中直接傳回POSITON_NONE的常量;

http://blog.sina.com.cn/s/blog_7607703f0101a7t0.html

http://www.jianshu.com/p/266861496508

28.android 桌面生成了兩個圖示

原來是兩個activity都有launcher和main的入口了

29.ListView無法顯示分割線

明明設定了divider的顔色;

<ListView  
    android:id="@+id/local_groups_list"  
    android:layout_width="match_parent"  
    android:layout_height="wrap_content"  
    android:divider="@color/divider_color"  
    android:dividerHeight="1px" 
android:footerDividersEnabled="false"/>
           

要設定diverHeight才行;android:footerDividersEnabled="false"表示最後一欄不需要分割線;

30.ListView的selector無效

被子布局給覆寫了,設定屬性:

drawSelectorOnTop屬性并設定為true即可;(但選中時,子布局會被這個給覆寫)

或者直接給子布局設定selector,state_pressed即為狀态改變的flag。

參考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0923/1705.html

31.百度地圖定位不準

偏離了一部分的原因是:編碼問題。擷取到的經緯度要轉換成百度對應的經緯度才不會有偏差;

http://lbsyun.baidu.com/index.php?title=androidsdk/guide/coordtrans&qq-pf-to=pcqq.c2c

官網代碼未寫全,自己改了下:

// 将裝置采集的原始坐标轉換成百度坐标
CoordinateConverter converter = new CoordinateConverter();
if (location.getLocType() == BDLocation.TypeGpsLocation) {
    converter.from(CoordinateConverter.CoordType.GPS);
} else {
    converter.from(CoordinateConverter.CoordType.COMMON);
}
// sourceLatLng待轉換坐标
LatLng sourceLatLng = new LatLng(location.getLatitude(), location.getLongitude());
converter.coord(sourceLatLng);
LatLng desLatLng = converter.convert();
location.setLatitude(desLatLng.latitude);
location.setLongitude(desLatLng.longitude);
           

32.LayoutInflator的使用方式

http://www.2cto.com/kf/201407/313054.html

http://www.cnblogs.com/wenfei123chai/p/4597404.html

http://blog.csdn.net/u012702547/article/details/52628453

摘:

public View inflate(intresource, ViewGroup root, boolean attachToRoot):

reSource:View的layout的ID 

root:需要附加到resource資源檔案的根控件,inflate()會傳回一個View對象,如果第三個參數attachToRoot為true,就将這個root作為根對象傳回,否則僅僅将這個root對象的LayoutParams屬性附加到resource對象的根布局對象上,也就是布局檔案resource的最外層的View上。如果root為null則會忽略view根對象的LayoutParams屬性(注意)。

attachToRoot:是否将root附加到布局檔案的根視圖上

33.Android Studio如何删除module

http://blog.csdn.net/hyr83960944/article/details/37519299

簡而言之,就是先從setting.gradle檔案中删除配置代碼,然後點選右鍵删除;

然後删除builde.gradle中的子產品依賴,例如:

compile project(path: ':easeuii')
           

34.assets檔案夾如何添加檔案——>老是添加進values檔案夾

以下是正确方法:

Android 雜知識總結

(之前都選則了xml檔案...)

35.java.lang.UnsatisfiedLinkError

在真機4.4.2的系統上能正常安裝,但是在模拟器6.0的系統上安裝時就出現這個錯誤;

http://www.jianshu.com/p/d08064bf6b85

在gradle配置:

android {
    defaultConfig {
        multiDexEnabled true
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
    }
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}
           

後删除apk重新安裝即可;

36.百度地圖No config chosen

要用TextureMapView來代替之前的MapView;

參考:http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=90348

37.notifydatasetchanged無效

http://blog.csdn.net/csdn_lqr/article/details/50947825

文章說的很清楚——>自以為資料源改變了,其實并麼有改變,因為指向的是位址,而不是堆區;

38.EditText 設定軟鍵盤顯示 搜尋,Enter鍵

http://jingyan.baidu.com/article/a681b0de331d733b18434621.html

android:imeOptions=""
actionSearch: 搜尋
actionSend:  發送
actionNext:   下一項
           

http://blog.csdn.net/jyz_2015/article/details/51543318

39.微信要打正式包後才能分享

40.android錄音後iOS無法播放

//指定音頻編碼方式

mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);

将編碼方式制定為AAC;

參考:http://blog.csdn.net/u012416928/article/details/39893411

Android 雜知識總結