CardView要在布局最外边,不然阴影显示不全
获取app的目录
获取当前程序路径
getApplicationContext().getFilesDir().getAbsolutePath();
获取该程序的安装包路径
String path=getApplicationContext().getPackageResourcePath();
获取程序默认数据库路径
getApplicationContext().getDatabasePath(s).getAbsolutePath();TextUtils.isEmpty(s) 判断字符串s是否为双空,即null或者长度为0
获取某一天是星期几
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.setTime(format.parse(pTime));//pTime是我们的日期,格式"2016-03-04"
int i = c.get(Calendar.DAY_FOR_WEEK);
返回值1是星期日,2是星期一,以此类推
- 计算两个日期之间的天数
计算出两个日期之间的毫秒数,转换成天数。
private int getDays(String day1, String day2) {
try {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = simpleDateFormat.parse(day1);
Date date2 = simpleDateFormat.parse(day2);
GregorianCalendar cal1 = new GregorianCalendar();
GregorianCalendar cal2 = new GregorianCalendar();
cal1.setTime(date1);
cal2.setTime(date2);
return (int)((cal2.getTimeInMillis()-cal1.getTimeInMillis())/(1000*3600*24));
} catch (ParseException e) {
e.printStackTrace();
return -100;
}
}
- 存储目录
package = Io.github.yuedev
//内部存储
context.getCacheDir
/data/data/Io.github.yuedev/cache
context.getFileDir
/data/data/Io.github.yuedev/files
context.getDir
/data/data/Io.github.yuedev
//外部存储
context.getExternalCacheDir
/sdcard/Android/data/io.github.yuedev/
cachecontext.getExternalFilesDir
/sdcard/Android/data/Io.gothub.yuedev/files
Environment.getExternalStorageDirectory
/sdcard/
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES)
/sdcard/Movies
- API21以上使用旧版本的DatePicker样式
API21(Lolipop)开始引入MD风格的DatePicker,如果我们想用之前的DatePicker样式,在XML的datePicker里使用以下属性
android:calendarViewShown="false"
android:datePickerMode="spinner"
注意,仅能在API21以上只用android:datePickerMode属性。
8.想给Fragment传递参数的话,不要用带参数构造方法,Fragment最好只有默认的无参构造方法。传参数用setArguments()方法。
9.利用String.split()拆分字符串,利用replace()修改字符串。
String path = "sdcard/test.mp2";
String[] strings = path.split("/");
这样strings数组内容就是sdcard和test.mp2
String fileName = strings[1].replace("mp2", "mp3");
这样,fileName的值就是test.mp3
10.TextView内容过多显示省略号,用ellipsize属性。比如在xml里:
android:ellipsize="end"
11.设计支持库com.android.support:design在28版本后新增了几种view,比如MaterialCardView和MaterialButton,其中MatreialCardView比之前的CardView多了几种常用属性,比如stroke描边。x
app:cardCornerRadius="10dp"
app:cardElevation="0dp"
app:strokeWidth="1dp"
app:strokeColor="@android:color/darker_gray"
app:cardBackgroundColor="@android:color/holo_orange_light"
12.RecyclerView视图错乱
如果在自己定义的adapter或者viewHolder里数据源有if的时候,一定跟上一个else,这样保证每次复用都会进行一次赋值。详细见下边这篇文章。
https://www.jianshu.com/p/6b990f339f49
public void bind(Note note) {
mNote = note;
mCardView.setCardBackgroundColor(getResources().getColor(mNote.getColorResId()));
//这里mNote的背景如果是白色,给mCardView描边。
//一定要在else里给不是白色背景的mCardView设置描边宽度为0,不然会出现描边错乱。
if (mNote.getColorResId() == R.color.backgroundColor0) {
mCardView.setStrokeColor(getResources().getColor(R.color.defStrokeColor));
mCardView.setStrokeWidth(3);
} else {
mCardView.setStrokeWidth(0);
}
}
13.TextView的fontFamily可以定义字体,每个api的字体可能稍有不同,具体在SDK文件夹的platform文件夹下里边的font.xml查看,貌似对中文不起作用。textAppearance属性可以使用google推荐的字体样式,如大小颜色等,api21可以用material标准,api21以下用appcomat的标准也很好。
- 在用tint改变view的颜色时,经常需要用到TintList类型,一般是用ColorStateList.valueOf(colorId)方法。这里的colorId不能直接用我们的resId,需要先用ContextCompat.getColor(context, resId)获取colorId。
val colorId = ContextCompat.getColor(imageView.context, resId)
ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(colorId))
或者
ImageViewCompat.setImageTintList(imageView, ContextCompat.getColorStateList(imageView.context, resId)
具体见官方的databinding demo
https://codelabs.developers.google.com/codelabs/android-databinding/
推荐阅读
http://kaywu.github.io/2016/07/17/Android-Storage-Note/