Android老司机搬砖小技巧

作为一名Android世界的搬运工,每天搬砖已经够苦够累了,走在坑坑洼洼的道路一不小心就掉坑里了。

SDK常用工具类

Android SDK中本身就拥有很多轮子,熟悉这些轮子,可以提高我们的搬砖效率。

  • android.text.TextUtils

    字符串操作常用方法:isEmpty()join()split()

    if(!TextUtils.isEmpty(text)){
        //do something
    }
  • android.webkit.URLUtil

    链接相关常用方法:isHttpUrl()isNetworkUrl()decode()

  • android.util.Patterns android.support.v4.util.PatternsCompat

    该类定义了许多常用正则表达式常量,可直接拿来用,例如:IP地址IP_ADDRESS,网址WEB_URL,Email地址EMAIL_ADDRESS,电话PHONE

    有了它,妈妈再也不用担心我正则表达式的问题了。

    Matcher urlMatcher = Patterns.WEB_URL.matcher(text);
    if (urlMatcher.find()) {
        //find url
    }
  • android.telephony.PhoneNumberUtils

    电话相关工具类

  • android.text.format.Formatter

    格式化文件大小,以GB,MB,KB为单位。

  • android.media.ThumbnailUtils

    创建图片或视频缩略图

    常用方法:createImageThumbnail()createVideoThumbnail()

  • android.database.DatabaseUtils

    数据库操作相关工具类

    ?

常见的坑

以下经验是AC在开车时的出现事故的小笔记。其中的解决方案,由于飚车环境差异和AC本人的能力有限,各位老司机可以酌情参考,同时也欢迎老司机评论指出。

  1. Handler处理异步操作时 用isFinishing()判断当前的Activity是否存在: 比如在联网请求数据回调回来之后,在Handler的handleMessage()方法中,用

    isFinishing() 判断当前的Activity是否存在,否则极易出现空指针等异常。

  2. 在ListFragment中set footer,不要在onCreateView()中设置; 要在onActivityCreate()中设置 否则会Caused by: java.lang.IllegalStateException: Content view not yet created
  3. 如果页面中的的样式如果出现了很奇怪的渲染(花屏,闪烁等异常),看看所在的Activity或者View是否添加了硬件加速。
  4. setCustomAnimations方法要在replace,remove等方法之前,否则设置无效。

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
       ft.setCustomAnimations(R.anim.push_up_out, 0);
       ft.replace(R.id.frame_content,mFragment);

  5. 在onCreate中获取到View的高度和宽度,直接调用View.getHeight()View.getWidth(),均得到0。应该使用以下方式获取View的高度或宽度。
    mView.post(()->{
      Log.d("width:"+mView.getWidth()+",height:"+mView.getWidth());
    });
  6. ActivityA通过startActivityForResult()启动了ActivityB。如果ActivityB的launchMode是singleTop或singleTask就要注意了,ActivityA的onActivityResult(int requestCode,int resultCode,Intent data)方法中的resultCode一定是Activity.RESULT_CANCELED
  7. startActivity的时候闪退并出现了以下log:
    • java.lang.SecurityException: Unable to find app for caller android.app.ApplicationThreadProxy。This log means that your app is having trouble handling a communication intent. Sometimes problems like this can be cause by sending an intent with big extras. Try to reduce the dimension of the image or, and this is the best way, save your image on the sd and put in the extras only the Uri of that image。
    • android.os.TransactionTooLargeException

    注意:不要在intent中传递大量的数据数据(例如List,大的图片等),否则会抛异常。

  8. drawable 中的selector文件 如果使用android:exitFadeDuration="@android:integer/config_shortAnimTime"这个属性,那么不同的手机可能会有不同的效果,慎用!!
  9. 在实现WebView与JS交互的过程中,如果遇到点击后JS方法无响应,应该注意一下问题:(1)WebView.addJavascriptInterface(new AndroidClick(), "android");这个方法的别名android是否与JS中的对象名称一致如 (2)WebView需要实现注册这个回调函数。
  10. WebView.setWebChromeClient(new WebChromeClient(){
            @Override
            public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
                return super.onJsAlert(view, url, message, result);
            }
     });

    (3)如果发布的APP有进行混淆,那么AndroidClick这个JS 与 JAVA交互的类需要proguard.cfg文件忽略这个类的混淆,否则混淆后JS将执行不了。

    keepclassmembers class net.angrycode.js2java.AndroidClick{
      *;
    }

  11. TextView实现简单的图文,可以使用TextView的drawableTop等属性来设置文本上的图片;还可以配合ImageSpan使用来设置图片。
  12. AlertDialog 按确定按钮不消失的方法
AlertDialog dialog = builder.create();
   dialog.setCanceledOnTouchOutside(true);
   dialog.show();   dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(v -> {
           String text = editText.getText().toString().trim();
           if (TextUtils.isEmpty(text)){
               ToastUtils.showToast(this,R.string.say_something);
               return;
           }
           //这里执行对话框消失
           dialog.dismiss();
       });

微信关注我们,可以获取更多

时间: 2024-10-28 19:51:32

Android老司机搬砖小技巧的相关文章

android com.handmark.pulltorefresh 使用小技巧

最近使用android com.handmark.pulltorefresh 遇到一些小问题,现在总结一些: 集体使用教程见: http://blog.csdn.net/harvic880925/article/details/17680305 http://blog.csdn.net/flybywind/article/details/8977734 1:设置单边 刷新: mPullRefreshListView.setMode(Mode.PULL_FROM_END);//向下拉刷新  mPu

Android 高效开发的一些小技巧总结

Android 高效开发的一些小技巧总结 善用快捷键 关于快捷键的使用,请戳这里 经常看到有人在一行一行的手工复制粘贴代码,或者一个变量一个变量的改名称.每次看到,心里都会一个劲的在吐槽:不要这么鸡肋好吗. 善用批处理(命令行) adb shell 命令大家应该都是会用的吧,比如 adb uninstall com.xxx.xxx 用来卸载程序,但是很少有人把他写到批处理里面吧. 日常Android开发中,我们经常需要卸载已安装的应用,或者清除应用的缓存等等,如果应用的缓存目录保存在内存卡中的话

10年Android老司机教你打造独一无二的刷新加载框架

首先我们给出如下几个参数,后面要用: 10年Android老司机教你打造独一无二的刷新加载框架既然是刷新,我们的滚动肯定是在 父view 之前的.所以我们需要在 onNestedPreScroll 这个方法里面写上我们所需要改动的x,y值. 我们需要用 父view 去拦截它.我们需要判断 dy 的值是否大于0,因为大于0是刷新操作,小于0是加载操作.然后我们需要判断 recyclerview 是否是纵向的而不是横向的. 10年Android老司机教你打造独一无二的刷新加载框架上拉加载 上面我也说

Android Studio之build.gradle小技巧

一: 当你工程引用android 的support包的时候,常常会这样写: dependencies { compile 'com.android.support:recyclerview-v7:22.2.1' } 注意看数字,标示你引用跟你的targetSdkVersion对应的版本的support包,如果一个这样写,倒是也无所谓,如果多的话,并且需要切换targetSdkVersion的时候就有点麻烦了,可以这样写: ext { supportLibVersion = '23.1.1'} d

【Android应用开发】分享一个录制 Android 屏幕 gif 格式的小技巧

因为写博客总是需要录制 Android 软件的演示效果, 研究了将近一小时找到了合适的工具; 录制流程 : -- 1. 录制 Android 手机屏幕内容 : 使用 拍大师 软件录制 Android 屏幕内容; -- 2. 导出视频 : 将 拍大师 录制的 MP4 格式的视频导出到电脑上; -- 3. 转换格式 : 将 mp4 格式的视频 转为 gif 格式图片; -- 4. 录制效果图 : 1. 录制 Android 屏幕 工具准备 : -- 拍大师 PC 版 : http://dashi.a

android 操作sqlite的一点小技巧

1.android 在sqlite插入数据时,是非常耗时的操作,原因是sqlite缺省会为每个插入操作开启一个事务,当数量变多的时候,自然时间就变得很慢,这时候可以考虑在插入等操作时先开启一个事务,再来批量操作. 可以参考例子:http://bbs.csdn.net/topics/360042960 2.sqlitedatabase关于事务的一些操作: SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查

Android RadioGroup RadioButton的一个小技巧

1.先上代码 <RadioGroup android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <RadioButton android:id="@+id/rb_feature" android:layout_width="match_pare

【Android】实现线程异步小技巧

方式不止一种,这里使用的是Timer类,创建一个定时器.我们经常需要获得移动设备端口的显示屏信息,但是onCreate()方法执行的时候,OnShow()方法不一定执行了,也就是说,在执行Oncreate()时候屏幕还没加载出来,所以这时候可以应用一个异步机制获取数据. import android.app.Activity; import android.os.Handler; import android.os.Message; import android.view.View; impor

Android代码的几点小技巧

1)View的状态保存与恢复dispatchRestoreInstanceStateonRestoreInstanceStateonSaveInstanceState 2)Service的前台服务使用startForeground(NOTIFICATION_ID, mNotification)stopForeground(true) 3)Avoid internal getters/setters 避免内部的get/set访问器不使用JIT时,直接访问成员变量比使用get方法能够提升3倍速度.而