本文共 11141 字,大约阅读时间需要 37 分钟。
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();
ContextCompat.getColor(Context context, int id);改用以上获取方法。
原因在于未引入相应的命名空间
xmlns:fresco="http://schemas.android.com/apk/res-auto"
另外注意:使用Glide去加载SimpleDraweeView时,SimpleDraweeView即便设置了圆角也无效。(可能两者有冲突吧)
同样0.01 !=0.01f
(在做数据判断时,容易出现认为上述两者是相等的误判)
在代码中设置:
imageView.setAdjustViewBounds(true);
放在FrameLayout父布局中,然后子布局中使用layout_gravity=”center”。在布局编辑器中是在图片下面显示的,但是在真机上是显示在中央的。
参考地址:
//使用处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;}
做一个平移动画时,组件移动过程中被其他组件挡住。
android:clipChildren="false"
要在父布局中设置这个属性,且有可能需要在祖父布局中页设置这个属性——>关键看需要把动画传递到哪个位置的布局中(网上的一些案例没有注意这点,所以很多时候么效果)
没发现直接对应的属性:直接改的height,会自动缩放间距比例。
a.懒加载:需要的时候再加载(切换到这个Fragment的时候再去加载)
参考:
b.ViewPager与Fragment配合使用时:
1.setUserVisibleHint 先于onAttach调用;
2.onAttach如果已经是attached状态,则不会走进这个生命周期;
3.setUserVisibleHint(boolean isVisibleToUser)返回传递的参数是表示该fragment是否可见;
4.今日头条的预加载也是临近的两个pager才进行,始终保持3个pager的运行,只不过首先是从内存中取出数据然后结合上次刷新的时间决定是否请求忘了加载数据。
使用这个组件后,要求allowBackup=true,改为false后就出现上面的问题了,按照上面的解释,在<application>标签中加入;tools:replace=":allowBackup" 就可以了。——>启示:很多时候的错误,IDE已经给出解决方案了,首先按照IDE的说明去做而不是直接去网上查找,这样效率来得快得多(对问题的掌握度也更好一些)。
BottomNavigationBar先放在前面然后在FrameLayout中使用layout_above 是表示:先固定好BottomNavigationBar的位置,然后将FrameLayout放在其上面;
如果相反,先把FrameLayout 放在上面,然后BottomNavigationBar中使用layout_below表示,则当FrameLayout中是列表时,则无法在屏幕显示出BottomNavigationBar了。
所以——>RelativeLayout中子view的顺序很重要!public static String [] returnImageUrlsFromHtml() { List参考地址:imageSrcList = new ArrayList (); String htmlCode = returnExampleHtml(); Pattern p = Pattern.compile(" ]*\\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()]);}
摘:对于现在市面上很多Android设备,自带了一个大的存储空间,一般是8GB或16GB,并且又支持了Sdcard扩展,对于这样的设备,使用Enviroment.getExternalStorageDirectory()方法只能获取到设备自带的存储空间,对于另外扩展的Sdcard而言,需要修改路径。
也就是:系统也存在sdcard ,一般代码只能获取设备自带的这个sdcard,而不能获取用户手动插入的sdcard(这个为外置SD卡)。
以“-”之类的进行分割,若“-”是第一位,则分割出来的数组第一位是为空;
直白点就是:假如有字符串"-ab",以"-"作为分割符,则分割出来是数组是 ["","ab"]。
一般是state_pressed起作用,但只是瞬间的变化,想要长久的保持状态,目前是通过数据逻辑来控制的;
右下角的选中图标通过和button在FrameLayout中叠加实现;
a. 改变icon的图片资源大小;
b.Dimen文件下覆写相关属性
48dp
这样系统在调用的时候就会使用这个覆写的值.
参考地址:
意思是不同的jar包引入了同样的类,所以冲突了:
一般来说就是删除依赖和jar包,但是既然是一同引入的,这样删除可能是有问题的;
参考地址:
后者是每次读一个字节,这也就导致对于中文(两个字节)的读的过程中就出现乱码;
前者效率比后者高: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或者其他什么书,在读的过程中分配的空间很可能是没有被完全占满的——>导致也一并被读入到了输出流中); 而使用第二种就不用担心上面的情况,因为这个就好比按劳分配,有多少数据就读多少,不会占用无用的资源。
simpleDrawee.setImageURI(Uri.parse("file://" + file.getAbsolutePath()));
是要构造“ file://”这样的前缀;
参考:
另外还要在getItemPostion中直接返回POSITON_NONE的常量;
原来是两个activity都有launcher和main的入口了
明明设置了divider的颜色;
要设置diverHeight才行;android:footerDividersEnabled="false"表示最后一栏不需要分割线;
被子布局给覆盖了,设置属性:
drawSelectorOnTop属性并设置为true即可;(但选中时,子布局会被这个给覆盖) 或者直接给子布局设置selector,state_pressed即为状态改变的flag。参考:
偏离了一部分的原因是:编码问题。获取到的经纬度要转换成百度对应的经纬度才不会有偏差;
官网代码未写全,自己改了下:
// 将设备采集的原始坐标转换成百度坐标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);
摘:
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附加到布局文件的根视图上
compile project(path: ':easeuii')
以下是正确方法:
(之前都选则了xml文件...)
在真机4.4.2的系统上能正常安装,但是在模拟器6.0的系统上安装时就出现这个错误;
在gradle配置:
android { defaultConfig { multiDexEnabled true ndk { abiFilters "armeabi", "armeabi-v7a", "x86", "mips" } } sourceSets { main { jniLibs.srcDirs = ['libs'] } }}
后删除apk重新安装即可;
要用TextureMapView来代替之前的MapView;
参考:
文章说的很清楚——>自以为数据源改变了,其实并么有改变,因为指向的是地址,而不是堆区;
android:imeOptions=""actionSearch: 搜索actionSend: 发送actionNext: 下一项
//指定音频编码方式
mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC); 将编码方式制定为AAC;