Android(安卓)开发经验Tips(5)
1. android WebView 加载重定向页面无法后退解决方案
webView.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } });
2. GridView 内容自动居中显示
设置完 android:numColumns
的个数之后GridView会自动从左到右排列,当不足一行的时候可以通过代码动态设置NumColumns来实现不足一行内容居中的效果
mGridView.setNumColumns(list.size);
3. Calendar类add()与roll()方法的区别
abstract void add(int field, int amount)
根据日历的规则,为给定的日历字段添加或减去指定的时间量。abstract void roll(int field, boolean up)
在给定的时间字段上添加或减去(上/下)单个时间单元,不更改更大的字段。
// 采取add()方法 时间会推进到8月1号Calendar calendar1 = Calendar.getInstance();calendar1.set(2017, Calendar.JULY, 31);calendar1.add(Calendar.DATE, 1);// 采取roll()方法 时间会回滚到7月1号Calendar calendar2 = Calendar.getInstance();calendar2.set(2017, Calendar.JULY, 31);calendar2.roll(Calendar.DATE, 1);
4. 显示超过一屏的网络长图
先将图片从网上下载到本地,然后经过Bitmap处理后,再加载
Glide.with(this).load(RequestUrl.BASE_URL + photoUrl) .downloadOnly(new SimpleTarget() { @Override public void onResourceReady(File resource, GlideAnimation<? super File> glideAnimation) { // 将保存的图片地址给SubsamplingScaleImageView,这里注意设置ImageViewState设置初始显示比例 Bitmap bitmap= BitmapFactory.decodeFile(resource.getAbsolutePath(),getBitmapOption(1)); // 显示处理好的Bitmap图片 imageView.setImageBitmap(bitmap); } });
ImageView的adjustViewBounds属性,设置它为true
android:adjustViewBounds="true"
5. 执行强制安装命令
如果应用已经获取了root权限了,那么我们可以实现自动安装,即不会出现应用安装的页面,会在后台自己慢慢的安装,这个时候使用的就是用代码去写命令行了
/** * 应用程序运行命令获取 Root权限,设备必须已破解(获得ROOT权限) * * @param command 命令:String apkRoot="chmod 777 "+getPackageCodePath(); RootCommand(apkRoot); * @return 0 命令执行成功 */public static int RootCommand(String command) { Process process = null; DataOutputStream os = null; try { process = Runtime.getRuntime().exec("su"); os = new DataOutputStream(process.getOutputStream()); os.writeBytes(command + "\n"); os.writeBytes("exit\n"); os.flush(); int i = process.waitFor(); Log.d("SystemManager", "i:" + i); return i; } catch (Exception e) { Log.d("SystemManager", e.getMessage()); return -1; } finally { try { if (os != null) { os.close(); } process.destroy(); } catch (Exception e) { } }}
这个方法就是将命令写入到手机的shell中,su就代表root权限了,而命令执行成功的话,会返回0的,接下来是安装命令
String command = "pm install -r " + mApkPath;
-r 代表强制安装,否则如果手机中已有该应用的话就会安装失败了,值得注意的是,要想等待命令执行的结果这个过程是很漫长的,所以在使用命令的时候是需要放到子线程中的
6. 时间格式化的细节处理
SimpleDateFormat f = newSimpleDateFormat("yyyy-mm-dd HH:mm:ss");
yyyy-mm-ddHH:mm:ss中月份的mm是必须大写(MM)的,否则会导致在格式化时会把分钟的时间放到月份位置,而小时的HH代表的24小时制,hh代表12小时制
7. JAVA中double类型运算结果异常的解决
对两个double类型的值进行运算,有时会出现结果值异常的问题,从二进制转化为十进制浮点数时,精度容易丢失,导致精度下降,要保证精度就要使用BigDecimal类.
double类型四则运算例子:
1、相加
public static double add(double a1, double b1) { BigDecimal a2 = new BigDecimal(Double.toString(a1)); BigDecimal b2 = new BigDecimal(Double.toString(b1)); return a2.add(b2).doubleValue(); }
2、相减
public static double sub(double a1, double b1) { BigDecimal a2 = new BigDecimal(Double.toString(a1)); BigDecimal b2 = new BigDecimal(Double.toString(b1)); return a2.subtract(b2).doubleValue(); }
3、相乘
public static double mul(double a1, double b1) { BigDecimal a2 = new BigDecimal(Double.toString(a1)); BigDecimal b2 = new BigDecimal(Double.toString(b1)); return a2.multiply(b2).doubleValue(); }
4、相除
public static double div(double a1, double b1, int scale) { if (scale < 0) { throw new IllegalArgumentException("error"); } BigDecimal a2 = new BigDecimal(Double.toString(a1)); BigDecimal b2 = new BigDecimal(Double.toString(b1)); return a2.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); }
scale参数为除不尽时,指定精度。
8. 在 LinearLayout 添加分割线 divider
LinearLayout有两个属性
1、divider
android:divider = ""
divider可以是图片文件,也可以是xml绘制的shape。
使用shape的时候一定要添加
<?xml version="1.0" encoding="utf-8"?>
2、showDividers
android:showDividers = "middle|end|beginning|none"
- middle 在每一项中间添加分割线
- end 在整体的最后一项添加分割线
- beginning 在整体的最上方添加分割线
- none 无
- dividerPadding 设置间隔
9. 绘制垂直居中的文字基准线
int centerY = getHeight() / 2;float baseLine = centerY + -(mPaint1.getFontMetrics().top + mPaint1.getFontMetrics().bottom) / 2 ;
10. couldn't find "xxx.so" 问题解决
defaultConfig { ndk { abiFilters 'armeabi' }}
指定要ndk需要兼容的架构(这样其他依赖包里mips,x86,armeabi,arm-v8之类的so会被过滤掉)
11. 不同属性下获取imageview的背景的Drawable
android:src
Drawable d = imageView.getDrawable();
android:background
Drawable d = imageView.getBackground();
12. Fragment的OnViewCreate方法会在事务提交后,在分线程中执行
如果直接在transaction.add(fragment).commit();后操作fragment中的view组件,可能会出现NullPointerException
因此,如果要在添加完fragment后立即操作fragment的view组件,应将操作写在fragment类的onViewCreated()方法中。
其他相关文章
Android 开发经验Tips(1) http://www.jianshu.com/p/c2c8ccd53636
Android 开发经验Tips(2) http://www.jianshu.com/p/21bc9c2a6563
Android 开发经验Tips(3) http://www.jianshu.com/p/79c417568075
Android 开发经验Tips(4) http://www.jianshu.com/p/b83c961d9587
更多相关文章
- Pycharm安装PyQt5的详细教程
- Android(安卓)Activity界面切换添加动画特效
- Android(安卓)环境搭建
- "Failed to fetch URL https://dl-ssl.google.com/android/repos
- Android(安卓)流式布局FlowLayout(搜索历史),多布局、删除、添加
- Android(安卓)bluetooth介绍(四): a2dp connect流程分析
- 第一章 andriod studio 安装与环境搭建
- Android(安卓)命令行编译、打包生成apk文件
- Ionic 运行报错No resource identifier found for attribute 'ap