Android 开发经验Tips(5)

作者: 燊在锦官城 | 来源:发表于2017-11-07 16:18 被阅读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"
    
    • 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

    相关文章

      网友评论

        本文标题:Android 开发经验Tips(5)

        本文链接:https://www.haomeiwen.com/subject/nwyjmxtx.html