1、在APP国际化中,当按钮上的字符从中文变成英文后,字符串会自动全部大写,可以用 android:textAllCaps="false" 属性,控制字符串是否自动大写。
2、当APP有设置生效需要重启APP时,可以重启到欢迎页面,这样交互比较好看,而且不会出现重启到主界面时的白屏或者黑屏。
3、当接口返回的数据有int类型数据时,为避免日后返回的数据突然不是int类型,所以写模型时int类型的数据,统一都用String来接收。
4、如果想让EditText不自动取得焦点,则可以在EditText的父布局设置
android:focusable="true"
android:focusableInTouchMode="true"
属性,即可。
5、在使用RecyclerView时,有时候会需要刷新RecyclerView中item的状态,一般我们可能使用notifyDataSetChanged()来刷新状态,但是使用notify系列的方法时有可能会导致失去焦点(这是一个BUG),因此我们可以使用局部刷新来刷新item的状态。
ViewHolder viewHolder = (ViewHolder) mRecyclerView.findViewHolderForAdapterPosition(position);
viewHolder.mCheck.setBackgroundResource(R.mipmap.collect_normal);
6、当APP存在账号切换功能时,如果APP内有数据是使用数据库来存储的,则在数据库帮助类中不要使用单列模式,否则切换账号后,会出现数据混乱的情况。
7、使用Glide加载图片时,有的图片第一次加载的时候只显示占位图,第二次才显示正常的图片。网上搜到集中解决方案,第一个是不使用占位图(对于我来说没用),第二是使用Glide的Transformation API自定义圆形Bitmap的转换。第三是不使用Glide的动画,加上一条.dontAnimate() (我就是这样解决的)。
8、getChildAt(int position)方法中position指的是当前可见区域的第几个元素,如果要得到position所对应的item,则应该使用View view = listview.getAdapter().getView(position,null,listview);
9、在Java中有Float.NaN 和 Double.NaN ,意思是Not a Number ,非数,是计算机科学中数值数据类型的一个值,表示未定义或不可表示的值。目前只在使用MPAndroidChart时,处理数据是使用到了,如果不想让MPAndroidChart绘制线条时,当数据为空,可以传入一个Double.NaN 或 Float.NaN,而不是传入0.
10、电脑上打jar包
(1)新建一个manifest.txt文件,在里面写一句就可以了:Manifest-Version: 1.0
(2)然后把manifest.txt的后缀改成.mf即变成了manifest.mf
(3)进入cmd,进入准备打包的那个根目录,这里把要打包的文件夹与manifest.mf放在了一个cd目录下
(4)输入:jar cvfm Notepad.jar manifest.mf Notepad
注:jar 是打包命令;cvfm 是参数; Notepad.jar 是打完包后的文件名;
参数c表示要生成一个新的JAR文件;f表示要生成的JAR文件的名字;m表示文件清单文件的名字。
*.class 只能把 class 文件打包进去,改成 . 可以把当前目录中的文件和文件夹全部打包进去。
(5)这里输入根目录或直接输入要打包的目录都可以,打出来的包是相同的
11、关于Fragment(XXFragment)not attached to activity 的异常
出现此异常是因为Fragment还没有attach到Activity,调用了getResource()等需要上下文context的函数。 解决方法是在调用此类方法前,先使用 isAdded()判断。
12、在适配Android7.0时,我们需要将Uri.parse、Uri.fromFile、file://、conteng://、context.getFilesDir()、Environment.getExternalStorageDirectory()、getCacheDir()、以及intent.setDataAndType 等做适配修改。首先需要定义一个FileProvider在Manifest.xml中,
<application>
...
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/filepaths"/>
</provider>
...
</application>
其中grantUriPermissions需要设置为true,你才能获取临时共享权限。
然后我们在res-xml下新建filepaths.xml文件,文件名随意,需要与上面resource中的一致。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<!--
<files-path/>代表的根目录: Context.getFilesDir()
<cache-path/>代表的根目录: getCacheDir()
<external-path/>代表的根目录: Environment.getExternalStorageDirectory()
<external-files-path/>代表的根目录: Context.getExternalFilesDir(String) Context.getExternalFilesDir(null).
<external-cache-path />代表的根目录: Context.getExternalCacheDir().
<root-path />代表设备的根目录new File("/");
-->
<!-- path=""代表根目录,也可以指定特定目录,name="camera_picture"是虚拟目录camera_picture -->
<root-path name="root" path="" />
<files-path name="files" path="" />
<cache-path name="cache" path="" />
<external-path name="external" path="" />
<external-files-path name="external_files" path="" />
<external-cache-path name="external_cache" path="" />
</paths>
</resources>
在代码中,比如之前使用 Uri.fromFile() 方法生成一个 File Uri,现在我们需要使用FileProvider 类提供的公有静态方法 getUriForFile 生成 Content Uri。例如这里有个将Bitmap转换成Uri的方法:
public static Uri saveBitmap(Bitmap bm) {
//在SD卡上创建目录
File tmpDir = new File(AppUtils.getContext().getFilesDir() + "/images");
if (!tmpDir.exists()) {
tmpDir.mkdir();
}
File img = new File(tmpDir.getAbsolutePath() + "/" + System.currentTimeMillis()+ "share.png");
try {
FileOutputStream fos = new FileOutputStream(img);
bm.compress(Bitmap.CompressFormat.PNG, 85, fos);
fos.flush();
fos.close();
return FileProvider.getUriForFile(AppUtils.getContext(),
BuildConfig.APPLICATION_ID + ".provider", img);
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
注意上面的.provider和Manifest.xml中的authorities中的要一样。