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<File>() {
@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的时候一定要添加<size> ,一定要添加color,即使是透明也要写上
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/black" />
<size android:height="1px" />
</shape>
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
网友评论