Android开发Android开发经验谈Android技术知识

Android 开发经验Tips(5)

2017-11-07  本文已影响63人  燊在锦官城

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"
  1. 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

上一篇下一篇

猜你喜欢

热点阅读