敲代码过程中,
老是忽略一些小问题,
或者使用过的比较好用的东西后面又记不起来了
所以,单开一贴以作记录。
### 47、版本号正则表达式
“`
/**
* 匹配版本号 ^\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/VitamioBundle ,https://github.com/yixia/VitamioBundle/issues/385
到android 7.0 会有问题 ,可以看下这个 https://github.com/Bilibili/ijkplayer