天天看点

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 设置软键盘显示 搜索,回车键

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 杂知识总结