android|android DatePicker 隐藏头部
android5.0及以上的版本中,DatePicker 在 calendar 模式下,自带了一个快速切换年份和日期的头部:
文章图片
带头部的DatePicker
隐藏这个头部的原理就是找到相应的 View 并设置 Visibility 为 Gone.
在 DatePicker 源码中,如果 mode 使用的是 Calendar 则会调用 createCalendarUIDelegate 方法。
switch (mode) {
case MODE_CALENDAR:
mDelegate = createCalendarUIDelegate(context, attrs, defStyleAttr, defStyleRes);
break;
case MODE_SPINNER:
default:
mDelegate = createSpinnerUIDelegate(context, attrs, defStyleAttr, defStyleRes);
break;
}
createCalendarUIDelegate 则会返回一个 DatePickerSpinnerDelegate
private DatePickerDelegate createCalendarUIDelegate(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
return new DatePickerCalendarDelegate(this, context, attrs, defStyleAttr, defStyleRes);
}
其中 DatePickerCalendarDelegate 使用的布局文件为 R.layout.date_picker_material
final int layoutResourceId = a.getResourceId(R.styleable.DatePicker_internalLayout, R.layout.date_picker_material);
// Set up and attach container.
mContainer = (ViewGroup) inflater.inflate(layoutResourceId, mDelegator, false);
mDelegator.addView(mContainer);
R.layout.date_picker_material 的内容为
第一个 include 的布局就是头部了,接下来要做的就是找到这个 View 然后隐藏掉。
ViewGroup rootView = (ViewGroup) datePicker.getChildAt(0);
if (rootView == null) {
return;
}
View headerView = rootView.getChildAt(0);
if (headerView == null) {
return;
}
headerView.setVisibility(View.GONE);
考虑到安全性,为了保证隐藏掉的 View 就是想要隐藏的头部,可以加上 id 的判断。
- 5.0中,头部根布局的 id 为 day_picker_selector_layout
- 6.0及以上,头部根布局的 id 为 date_picker_header
private void hideDatePickerHeader(DatePicker datePicker) {
ViewGroup rootView = (ViewGroup) datePicker.getChildAt(0);
if (rootView == null) {
return;
}
View headerView = rootView .getChildAt(0);
if (headerView == null) {
return;
}
//5.0+
int headerId = context.getResources().getIdentifier("day_picker_selector_layout", "id", "android");
if (headerId == headerView.getId()) {
headerView.setVisibility(View.GONE);
ViewGroup.LayoutParams layoutParamsRoot = rootView.getLayoutParams();
layoutParamsRoot.width = ViewGroup.LayoutParams.WRAP_CONTENT;
rootView.setLayoutParams(layoutParamsRoot);
ViewGroup animator = (ViewGroup) rootView.getChildAt(1);
ViewGroup.LayoutParams layoutParamsAnimator = animator.getLayoutParams();
layoutParamsAnimator.width = ViewGroup.LayoutParams.WRAP_CONTENT;
animator.setLayoutParams(layoutParamsAnimator);
View child = animator.getChildAt(0);
ViewGroup.LayoutParams layoutParamsChild = child.getLayoutParams();
layoutParamsChild.width = ViewGroup.LayoutParams.WRAP_CONTENT;
child.setLayoutParams(layoutParamsChild );
return;
}
//6.0+
headerId = context.getResources().getIdentifier("date_picker_header", "id", "android");
if (headerId == headerView.getId()) {
headerView.setVisibility(View.GONE);
}
}
【android|android DatePicker 隐藏头部】最终效果:
文章图片
隐藏头部的DatePicker
推荐阅读
- Android与iOS包体优化及一键自动打包脚本
- Android|Android Studio NDK&Jni开发--MD5加密
- Android|Android Studio模拟器运行apk文件
- Android|Android ViewBinding使用介绍
- Android三方依赖冲突Gradle中exclude的使用
- ShareSDK Android端分享与授权示例代码
- Android|Android资源管理框架(编译和打包)
- Android|Android资源管理框架(查找过程)
- Android|Android RenderScript 实现 LowPoly 效果(三)
- android|android kotlin Dimension