1.使用3DES加密解密的时候注意进制转换。
2.使用Studio导入项目时需配置使用本地gradle。
3.使用Studio导入第三方时,需配置正确maven参数才可正常导入(删除无影响)。
4.使用Volley网络请求框架,配置参数都正确,与后台联调发现每次请求都发2次,后来查找原因才发现这算是volley的一个bug吧。
5.MAC配置gradle :打开终端,输入open -e .bash_profile,
export GRADLE_HOME=/Users/ZDD/ZDD/gradle-2.8/bin;
export SDK_PATH=/Users/ZDD/Library/Android/sdk/platform-tools;
export PATH=${PATH}:${SDK_PATH}:${GRADLE_HOME}
然后 保存,输入source ~/.bash_profile
6.Listview没有点击事件。 到Item顶层布局中加入android:descendantFocusability="blocksDescendants"属性
7.MAC中.gradle文件夹是存在的。目录在/Users/ZDD/.gradle/
8.Android M 以上版本,申请权限时,记得不管是normal还是danger都需要在Manifest里注册
9.Android Studio创建DrawLayout或者NavigationView等控件时会出现Missing Style等错误,需要选择 AppTheme.Compat视图再切换回来就正常了。
10.使用ToolBar代替ActionBar时setsupportActionBar(toolbar) 只能在onCreateOptionsMenu中inflate布局,如果不使用setSupportActionBar(toolbar)这个方法,就可以使用toolbar.inflatemenu()这个方法加载布局。
11.使用videoView空间播放RAW中MP4文件,使用setVieoURI(Uri.parse("android.resource://"+getPackageName()+"/"+R.raw.video))无法播放视频,只能使用setVieoPath("android.resource://"+getPackageName()+"/"+R.raw.video)或者读取raw文件保存在SD卡中使用setVieoPath(Environment.getExternalStorageDirectory().getAbsolutePath()+"/startvideo.mp4")即可。
12.Android 6.0 只要应用targetSdkVersion为22以下,在6.0设备上运行不需要做权限处理,比如读取SD卡操作可以正常运行。
13.toolBar更改图标代码:(ActionMenuItemView)view.findViewById(R.id.menuitem).setIcon();
14.上传jcenter遇到Execution failed for task ':core:lint'错误,解决方法在moudle的gradle下添加
android {
lintOptions {
abortOnError false
}}代码即可.
15.上传jcenter遇到Execution failed for task ':core:mavenAndroidJavadocs'错误,解决方法在project的gradle下添加allprojects {
repositories {jcenter()}
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
options.addStringOption('encoding', 'UTF-8')
}}即可。
16.上传jcenter遇到http401错误,解决方法是正确的配置用户名和key
17.Studio 报错:libpng error not a png file,原因是资源文件中有些图片本身不是png格式,只是修改了后缀名导致的。
18.Studio运行项目时报Duplicate files copied in APK META-INF/... :file1:...file2:... 解决办法在build文件android下输入如下代码即可,其中...代表是报错文件名称.
packagingOptions {
exclude 'META-INF/...'
}
19.解决华为设备无法输出Log
华为手机:进入拨号界面输入:*#*#2846579#*#*
华为pad:打开自带计算器输入引号中的内容(不包含引号)“()()2846579()()=”
进入工程模式,依次选择ProjectMenu---后台设置----LOG设置---LOG开关 点击打开.
20.打包时找不到native方法,可能由于arm64-v8a,armeabi,armeabi-v7a...缺少,可以在app.gradle中defaultConfig下加上ndk过滤代码,如 ndk{abiFilters "armeabi"}
21.在编码时使用setOnClickListener(this)等方法时,一定要在onDestory方法中使之为空,防止内存溢出.
22.当父布局引用.9图作为背景时,会出现布局异常,解决方案:用Relative嵌套一个ImageView去引用它.
23.使用TextInputLayout模式设置为password时,更改右侧图标使用passwordToggleDrawable属性,使之隐藏属性为passwordToggleEnabled=false。
24.使用EditText控件时,在顶层布局上添加属性focusable=true,focusableInTouchMode=true,则点击除EditText之外的区域,会使得EditText失去焦点,直接隐藏键盘即可。
25.XML解析方法:
InputStream input = asset.open("province_data.xml"); SAXParserFactory spf = SAXParserFactory.newInstance(); SAXParser parser = spf.newSAXParser(); XmlParserHandler handler = new XmlParserHandler(); parser.parse(input, handler); input.close(); provinceList = handler.getDataList();
26.找不到源码?试试在.AndroidStudio2.1\config\options目录下找到jdk.table.xml在对应平台下替换如下代码
<sourcePath>
<root type="composite">
<root type="simple" url="file://$USER_HOME$/Android/sdk/sources/android-24" />
</root>
</sourcePath>
27.RecyclerView的getAdapterPosition和getLayoutPosition主要区别在于:
Adapter和layout的位置会有时间差(<16ms),如果改变了Adapter的数据,然后刷新视图,layout需要过一段时间才会更新视图,在这段时间里,这两个方法返回的position会不一样。
在notifyDataSetChanged之后并不能马上获取adapter中的position,要等布局结束之后才能获取到。
对于layout的position,在notifyItemInserted之后,Layout并不能马上获取到新的position,因为布局还没有更新(需要<16ms的时间刷新视图),所以只能获取到旧的,但是Adapter中的position就可以马上获取到最新的position.
28.Html5启动App方法如下:
html端设置window.location.href='[scheme]://[host]/[pathPrefix]?name=zhangsan&age=18'
href->myapp://js.app/start?name...
App端:在Manifest.xml的Activity下追加<intent-filter>内容,注意:如果<intent-filter>中内容【android.intent.action.MAIN】和【android.intent.category.LAUNCHER】这两个,千万不能写在同一个<intent-filter>中,会导致应用启动图标在桌面消失等问题。必须按照如下格式写:
<intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.BROWSABLE"/> <category android:name="android.intent.category.DEFAULT"/> <data android:host="myapp" android:pathPrefix="/start" android:scheme="js.app"/> </intent-filter>
29.application下allowBackup属性默认为true,会导致信息外漏,可以通过打开调试开关,输入
adb backup -f back.ab -noapk com.xxx.xx备份数据到电脑,此时再换一台设备安装此应用执行
adb restore back.ab可以恢复数据。
另外还可以通过backup-extractor解密出内容。所以一般为了安全起见,把它设置为false。
30.在某页面做到手机无法截屏,需在Activity中加入这段代码:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
31.使用RxBus发送一条消息,接收时出现接收多次,导致问题原因是onDestory方法里没有unsubscribe()掉。
32.Service在Android5.0之后只能显示启动:
Intent intent=new Intent(context,MyService.class);
或者:Intent intent=new Intent("Service的action").setPackage("包名")。
33.Draw贪吃蛇追踪曲线方法:ObjectAnimator animator=new ObjectAnimator.ofFloat(PathView.thi,"percent",0.0f,1.0f);
animator.setDuration(3000);
animator.start();
create function private void setPercent(float percent){
mPaint.setPathEffect(new DashPathEffect(new float[]{percent*length,length},0));
invalidate();
}
则ObjectAnimator会自动调用类中自定义方法setPercent(XXX).
34.Text自带滚动 设置scrollbar属性为vertical,代码设置
textView.setMovementMethod(ScrollingMovementMethod.getInstance());
35.获取Maven私服aar文件时,如遇到项目死活编译不通过问题,就查看一下gradle.properties文件是否被写入代理
36.获取泛型类型
Type[] types = class.getClass().getGenericInterfaces();
List<Type> needtypes = new ArrayList<>();
for (Type paramType : types) {
if (paramType instanceof ParameterizedType) {// if Type is T
Type[] parentypes = ((ParameterizedType) paramType).getActualTypeArguments();
for (Type childtype : parentypes) {
needtypes.add(childtype);
if (childtype instanceof ParameterizedType) {
Type[] childtypes = ((ParameterizedType) childtype).getActualTypeArguments();
for (Type type : childtypes) {
needtypes.add(type);
}
}
}
}
}
37.导出Android ANR日志命令——adb pull /data/anr/traces.txt C:\
38.如若出现 No static method split_lib_dependencies_apk.apk问题,原因是项目中引用了不同版本的库导致
39.实现Fragment 懒加载功能,可以在onHiddenChanged(hidden)方法中加一个允许执行一次的Boolean变量去实现
40.android studio platform tools 27.0.0版本对Pixel 手机有BUG,连不上ADB,并且影响所有其他设备