编码细节提升

敲代码过程中,
老是忽略一些小问题,
或者使用过的比较好用的东西后面又记不起来了
所以,单开一贴以作记录。

### 47、版本号正则表达式
“`
/**
* 匹配版本号 ^\d+(.\d+)+*/      public static boolean isVersionCode(String str) {          return match(str, “^\d+(\.\d+)+ ”);
}

/**
* 正则表达式匹配
*
* @param text 待匹配的文本
* @param reg 正则表达式
* @return
*/
private static boolean match(String text, String reg) {
if (TextUtils.isEmpty(text) || TextUtils.isEmpty(reg)) return false;
return Pattern.compile(reg).matcher(text).matches();
}
“`


46、点击 弹出EditText的软件盘

   /**
     *  弹出EditText的软件盘
     * @param editText
     */
    public static void upEditTextKeyboard(EditText editText) {
        editText.setFocusable(true);
        editText.setFocusableInTouchMode(true);
        editText.requestFocus();
        InputMethodManager inputManager = (InputMethodManager) editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        inputManager.showSoftInput(editText, 0);
    }

45、AS代码块快捷键

ctrl + alt + t


44、退出应用时关闭java虚拟机

    @Override
    public void onBackPressed() {
         finish();
         System.exit(0);
    }

43、Gradle 的repositories 配置多个URL

allprojects {
    repositories {
        jcenter()
        // Add the Esri public Bintray Maven repository
        maven { url 'https://esri.bintray.com/arcgis' }
        maven { url "https://jitpack.io" }
    }
}

42、viewpager在Scrollview或recycleview中不显示

viewpager在这些滑动父控件下面使用需要指定高度,才能显示


41、Parcelable和Serializable的区别

我们知道在Java应用程序当中对类进行序列化操作只需要实现Serializable接口就可以,由系统来完成序列化和反序列化操作,但是在Android中序列化操作有另外一种方式来完成,那就是实现Parcelable接口.也是Android中特有的接口来实现类的序列化操作.原因是Parcelable的性能要强于Serializable.因此在绝大多数的情况下,Android还是推荐使用Parcelable来完成对类的序列化操作的.

首先Parcelable的性能要强于Serializable的原因我需要简单的阐述一下

1). 在内存的使用中,前者在性能方面要强于后者

2). 后者在序列化操作的时候会产生大量的临时变量,(原因是使用了反射机制)从而导致GC的频繁调用,因此在性能上会稍微逊色

3). Parcelable是以Ibinder作为信息载体的.在内存上的开销比较小,因此在内存之间进行数据传递的时候,Android推荐使用Parcelable,既然是内存方面比价有优势,那么自然就要优先选择.

4). 在读写数据的时候,Parcelable是在内存中直接进行读写,而Serializable是通过使用IO流的形式将数据读写入在硬盘上.

但是:虽然Parcelable的性能要强于Serializable,但是仍然有特殊的情况需要使用Serializable,而不去使用Parcelable,因为Parcelable无法将数据进行持久化,因此在将数据保存在磁盘的时候,仍然需要使用后者,因为前者无法很好的将数据进行持久化.(原因是在不同的Android版本当中,Parcelable可能会不同,因此数据的持久化方面仍然是使用Serializable)


40、TextView在代码中设置img

    /**
     * 设置textView的图像
     *
     * @param context
     * @param textView
     * @param img
     * @param position--设置图像位置,left-0, top-1, right-2, bottom-3
     */
    public static void tvSetImg(Context context, TextView textView, int img, int position) {
        Drawable nav_up = context.getResources().getDrawable(img);
        nav_up.setBounds(0, 0, nav_up.getMinimumWidth(), nav_up.getMinimumHeight());
        switch (position) {
            case 0:
                textView.setCompoundDrawables(nav_up, null, null, null);
                break;
            case 1:
                textView.setCompoundDrawables(null, nav_up, null, null);
                break;
            case 2:
                textView.setCompoundDrawables(null, null, nav_up, null);
                break;
            case 3:
                textView.setCompoundDrawables(null, null, null, nav_up);
                break;

        }
    }

39、控件小写报错

程序有一个页面用到了下面的分割线,然后只要是跳转到这个页面都会报

Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null objec

这个错,原因是把View写成了view,控件大小写的问题

<?xml version="1.0" encoding="utf-8"?>
<view xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="@color/colorLineGray"
    android:layout_width="match_parent"
    android:layout_height="0.5dp" />
<?xml version="1.0" encoding="utf-8"?>
<View xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="@color/colorLineGray"
    android:layout_width="match_parent"
    android:layout_height="0.5dp" />

38、可折叠的ListView—-ExpandableListView


37、Android中Activity四种启动模式和taskAffinity属性详解

activity的启动模式会影响Task和Back Stack的状态,进而影响用户体验。除了启动模式之外,Intent类中定义的一些标志(以FLAG_ACTIVITY_开头)也会影响Task和Back Stack的状态

Android中Activity四种启动模式和taskAffinity属性详解


36、Intent的Action、Category属性

通过在Action属性或Category属性中设置具有一定含义的字符串信息。
然后在项目清单文件中注册Activity类时,通过标签来设置与上一步中相同的action或category字符串。从而启动符合条件的Activity。

android Intent的Action、Category属性


35、Activity之间的回调

Activity之间不能使用handler进行消息传递,所以在不同的Activity之间多用广播传递消息,相邻的Activity之间可以使用startActivityForResult()进行消息传递。

  • A.Activity中的代码
    注意startActivityForResult()的第二个参数requestCode不能小于0
startActivityForResult(new Intent(A.this,B.class),0);
...
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (resultCode){
            case RESULT_OK:
                new CenterHintToast(A.this,"返回成功!");
                break;
            default:
                break;
        }
    }
  • B.Activity中的代码
    在finish自身之前setResult()即可
...
 this.setResult(RESULT_OK);
 this.finish();

34、禁止Gradle检查PNG的合法性

在gradle 中加上

//禁止Gradle检查PNG的合法性
aaptOptions.cruncherEnabled = false
aaptOptions.useNewCruncher = false

33、java占位符的使用

<string name="text1">i am %1$d years old, i am a %2$s</string>

属性值定义如下:

%n$m[d/f/s] 表示 第n个参数,前面有m个空格(0m表示有m个0,浮点数k.m,表示小数点前保留k位,小数点后保留m位),d为整数,f为浮点数,s为字符串。

具体使用

<string name="gallery_finish">( %1$d / %2$d ) 完成</string>
...
tvFinish.setText(getString(R.string.gallery_finish, resultPhoto.size(), galleryConfig.getMaxSize()));

32、butterknife的导入不能在Module里面

会报如下错误

Could not find method true(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatTextView with id 'textView0'

无法通过反射找到对应的控件

  compile 'com.jakewharton:butterknife:8.5.1'
  annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'

需要把compile放在项目的build.gradle文件中


31、不要在onBindViewHolder方法中调用 notifyDataSetChanged()

会报如下错误

java.lang.IllegalStateException: Cannot call this method while RecyclerView is computing a layout or scrolling

如果需要进行刷新操作,可以在onCreateViewHolder方法中进行


30、去掉字符串最后一个字符

str = str.substring(0,str.length()-1)

29、startActivityForResult的使用

相关函数
startActivityForResult(Intent intent, Int requestCode)
onActivityResult(int requestCode, int resultCode, Intent intent)
setResut(int resultCode, Intent intent)

1、startActivityForResult(Intent intent, Int requestCode)

requestCode >=0就好,随便用于在onActivityResult()区别哪个子模块回传的数据,如果还有C.java ,D甚至E子模块的话,每个区分开不同的requestCode就好。

Intent intent=new Intent();
intent.setClass(A.this, B.class);
startActivityForResult(intent, 0);

2、重写onActivityResult

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        switch (resultCode) { //resultCode为回传的标记,我回传的是RESULT_OK
            case RESULT_OK:
                Boolean isSubmitOk = data.getBooleanExtra("isSubmitOk",false);
                if (isSubmitOk)finish();
                break;
            default:
                break;
        }
    }

3、目标活动中setResut(int resultCode, Intent intent)
利用intent回传数据

 setResult(RESULT_OK, new Intent().putExtra("isSubmitOk",true));
 finish();

补充—> 调用setResult()方法必须在finish()之前。
那么如果在如下方法中调用setResult()也有可能不会返回成功: onPause(), onStop(), onDestroy(),
因为这些方法调用不一定是在finish之前的,当然在onCreate()就调用setResult肯定是在finish之前的


28、Edittext被遮挡

在清单文件的对应Activity中设置这个属性

 <activity android:name=".SatisfactionSurveyActivity"
            android:windowSoftInputMode="stateHidden|adjustPan"/>

27、APK内部打开下载链接

不用跳转到浏览器下载

  private void updateAPK(String url) {
        if (TextUtils.isEmpty(url)){
            new CenterHintToast(MainActivity.this,"APK路径出错!");
            return;
        }
        Uri uri = Uri.parse(HttpMethods.Img_URL+url);
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        startActivity(intent);
    }

26、让EditText不能自动获取焦点

在EditText的父级控件中添加如下属性:

 android:focusable="true"  
 android:focusableInTouchMode="true"

25、RecyclerView检测是否滑动到底部


24、Android Studio 上SVN的使用

  • 新项目提交到SVN

    VCS—> import into version control —>share into subversion

  • 已经在SVN上的项目更新内容提交到SVN

    Ctrl + K ,AS面板上VCS+向上的箭头,或者 VCS—>commit changes

  • SVN上项目检出

    VCS—> checkout from version control —>subversion


23、Android Studio 中建议过滤的文件

  • .idea 文件夹
  • .gradle 文件夹
  • 所有的 build 文件夹
  • 所有的 .iml 文件
  • local.properties 文件

22、使用butterknife 8.*时出现控件无法找到

在butterknife 7.*的时候,只需要引入

compile 'com.jakewharton:butterknife:7.0.0'

但是使用butterknife 8.*的时候就需要引入

compile 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'

21、dp 、 px Android适配

相关blog: http://www.jianshu.com/p/ec5a1a30694b

这里写图片描述


20、Recyclerview滑动时item显示错乱

1、在重用控件中,最重要的细节是:有if一定得有else,而且,不管是true还是false都要设置。
2、对于复用,可以在Bean对象中加一个字段用来标识,或者使用集合来记录位置。


19、java 判断string数组中是否有某个字符串

1.把数组各项放到list中,用list的contain判断;

//定义数组
String aa []={"timo","kainan","naer","lanbo"};
//数组转换成list
List<String> list=Arrays.asList(aa);
if(list.contains("timo")){...

2.遍历数组,逐条比较。

   String[] strList = new String[]{"aaaa","bbbb","cccc"};    
    for(int i = 0;i<strList.length;i++){        
        if(strList[i].contains("aaaa")){            
            //包含aaaa        
         }else{ 
           //不包含aaaa        
         }    
     }  

18、Java比较两个数组中的元素是否相同的最简单方法

 public static void main(String[] args) {  
                       String [] array1 = {"1","2","3"};  
                       String [] array2 = {"3","2","1"};  
                       Arrays.sort(array1);  
                       Arrays.sort(array2);  
                       if (Arrays.equals(array1, array2)) {  
                               System.out.println("两个数组中的元素值相同");  
                       } else {  
                               System.out.println("两个数组中的元素值不相同");  
                       }  
               }  

1、String的trim()方法

参考blog:http://blog.csdn.net/muyu114/article/details/5734295

String.Trim()方法会去除字符串两端,不仅仅是空格字符,它总共能去除25种字符:
(‘/t’, ‘/n’, ‘/v’, ‘/f’, ‘/r’, ’ ‘, ‘/x0085’, ‘/x00a0’, ’ ‘, ’ ‘, ’ ‘, ’ ‘, ’ ‘, ’ ‘, ’ ‘, ’ ‘, ’ ‘, ’ ‘, ’ ‘, ’ ‘, ‘?’, ‘/u2028’, ‘/u2029’, ’ ‘, ‘?’)

如果你想保留其中的一个或多个(例如/t制表符,/n换行符,/r回车符等),请慎用Trim方法。

请注意,Trim删除的过程为从外到内,直到碰到一个非空白的字符为止,所以不管前后有多少个连续的空白字符都会被删除掉。

去除字符串头部空白字符的TrimStart方法和去除字符串尾部空白字符的 TrimEnd方法

如果想去除字符串两端其他任意字符,可以考虑Trim他的重载兄弟:String.Trim(Char[]),传入你想要去除的哪些字符的数组。

空格 != 空白字符,删除空格请使用: Trim(‘ ‘);


2、Activity的isFinishing()方法

原因:若Activity调用了finish(),再调用Dialog\handlerMessage\接收广播等等需要Activity实例的方法时,会导致bug。

解决:使用isFinishing()方法判断Activity是否finish,再进行相关操作。


3、Android图片选择器框架GalleryFinal

原始地址:https://github.com/pengjianbo/GalleryFinal

迁移地址:https://github.com/FinalTeam/RxGalleryFinal

使用参考blog:https://segmentfault.com/a/1190000004263541?_ea=549747

可基于GalleryFinal定制自己的图片选择界面


4、本地图片获取

通过uri获取bitmap对象

Bitmap bitmap = MediaStore.Images.Media.gitBitmap(this.getContentResolver(),uri);


5、使用第三方库尽量进行二次封装

尤其是做大型项目或长远发展项目的时候,方便后期更换框架,降低耦合度。


6、AS快捷键

Cltr+Alt+F7,显示方法在哪里使用过
Cltr+Alt+L,代码格式化


7、Fiddler是一个很好的代理工具,可以抓取协议请求用于调试


8、EditText 的 imeOptions属性

配合singleLine = “true”使用

actionGo — 前往

actionDone — 完成

actionNext — 下一项

actionNone — 回车

actionPrevious — 上一项

actionSend — 发送

actionSearch — 搜索

其他


9、使用Bugly的时候

两个bulid.gradle文件都要做修改

app目录下的:

apply plugin: 'bugly' //添加Bugly符号表插件

compile 'com.tencent.bugly:crashreport:2.1.5'

bugly {
appId = '6c03c11b61' //注册时分配的App ID
appKey = '88f0e552-87fd-43cb-b34b-e102921dc8f1' //注册时分配的AppKey
// excute = true
// upload = true
}

project目录下的: classpath 'com.tencent.bugly:symtabfileuploader:1.3.4'//bugly


10、全局变量、标识符的提取

项目中多个地方使用到的变量、标识符,需要提取到一个单独的类中,避免混淆以及修改时的麻烦


11、APP主题做法

思路:把相关的图片、color的使用、全局变量都指向同一文件Theme.xml, 更换主题 就是控制Theme文件中的选择


12、常用的评分代码RatingBar

1、定义自己的progressDrawable,例如rating_bar_layer.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@android:id/background"
        android:drawable="@drawable/star_unchecked">
    </item>
    <item
        android:id="@android:id/secondaryProgress"
        android:drawable="@drawable/star_unchecked">
    </item>
    <item
        android:id="@android:id/progress"
        android:drawable="@drawable/star_checked">
    </item>
</layer-list>

2、定义自己的Style.xml

    <style name="ratingBar" parent="@android:style/Widget.RatingBar">
        <item name="android:progressDrawable">@drawable/rating_bar_layer</item>
        <item name="android:numStars">5</item>
        <item name="android:stepSize">1</item>
        <item name="android:maxHeight">23dp</item>
        <item name="android:minHeight">23dp</item>
        <item name="android:columnWidth">10dp</item>
    </style>

3、项目中使用

 <RatingBar
        android:id="@+id/rb_normal"
        style="@style/ratingBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

13、需要关闭的操作、一定要及时关闭

比如:IO流db操作结束后,需要db.close()使用到cursor的时候,要记得cursor.close()等等


14、asset和raw文件夹区别

res/raw目录的文件会被映射到R.java中。asset中的文件不会。

res/raw目录下不可再建文件夹,asset可以。

读取:
getResoures().openRawResource();

getAssets().open();


14、Fragment在切换的时候被销毁

项目中几次遇到这样的情况,一般项目框架都是由4个或者5个fragment组成,且经常需要切换,好几次都是切换的时候,原来的页面上的数据显示不了了,解决方法就是不让fragment销毁,也就4-5个fragment,不销毁也不会太占内存。
解决方法:

  • 改变预加载页数
viewPager.setOffscreenPageLimit(2);
  • 在Fragment的onCreateView方法中处理
private View view;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (view== null) {
            view= inflater.inflate(R.layout.fragment, container, false);
        //初始化处理
        initView();
        } else {
            ViewGroup viewGroup = (ViewGroup) view.getParent();
            if (viewGroup != null)
                viewGroup.removeView(view);
        }
        return view;
    }

15、 Android 复杂的列表视图界面绘制

这里写图片描述

如上图: 我们可以使用alibaba开源的vlayout 框架,github 地址:https://github.com/alibaba/vlayout

系列文章
http://pingguohe.net/2017/02/28/vlayout-design.html
http://pingguohe.net/2017/03/03/vlayout-guide-1.html
http://pingguohe.net/2017/03/03/vlayout-guide-2.html

还可以使用这个库—drakeet/MultiType,作者也是就职于阿里的android开发攻城狮

github 链接:https://github.com/drakeet/MultiType

详解文章:https://drakeet.me/effective-multitype


16、 将集合数据反转排序

集合有个工具类Collections,直接调用其静态方法,对集合排序反转:Collections.reverse(list);


17、 应用中视频播放

使用Vitamio会出现错误,可以试试Bilibili的ijkplayer。
https://github.com/yixia/VitamioBundlehttps://github.com/yixia/VitamioBundle/issues/385
到android 7.0 会有问题 ,可以看下这个 https://github.com/Bilibili/ijkplayer

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章