100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 安卓 自定义 日期和时间选择器 在一个布局中 可以直接调用

安卓 自定义 日期和时间选择器 在一个布局中 可以直接调用

时间:2022-09-19 03:39:00

相关推荐

安卓 自定义 日期和时间选择器 在一个布局中 可以直接调用

废话不多说先看效果,效果不符合,就不要用看了。

安卓提供自己的日期选择和时间选择,但是样式并不是自己想要的,如果非要把他们放在一起,会发现,样式不好看,而且时间和日期选择控件的大小不好控制,甚至根本没法放在一行上,所以实现自定义日期时间选择器有两种方式

1.自己写自定义控件,需要能滚动的WheelView,虽然网上有三方的WheelView,但是我们自己还要懂自己如何计算日期时间,时间确实比较麻烦,我们要去学习日历,很费劲

2.就是自己去根据安卓自己的日期和时间控件,进行组合,而这样,我们就需要解决两个问题

a.样式问题;

自己添加了安卓自己的日期控件会发现,各个版本样式不一样,当在一个系统运行效果是这样,但换个系统,样式就不一样了。那么就需要自己强制定义一个样式,如上图的样式是android:Theme.Holo.Light.Dialog 需要在style.xml自定义样式MyDialogStyleBottom

<!-- 自定义dialogActivity的样式 --><style name="MyDialogStyleBottom" parent="android:Theme.Holo.Light.Dialog"><item name="android:windowAnimationStyle">@style/AnimBottom</item><item name="android:windowFrame">@null</item><!-- 边框 --><item name="android:windowIsFloating">false</item><!-- 是否浮现在activity之上 --><item name="android:windowIsTranslucent">true</item><!-- 半透明 --><item name="android:windowNoTitle">true</item><!-- 无标题 --><item name="android:windowBackground">@android:color/transparent</item><!-- 背景透明 --><item name="android:backgroundDimEnabled">true</item><!-- 模糊 --></style>

那么需要自己的activity样式采用这个,就需要manifest配置如下

<span style="white-space:pre"></span><activityandroid:name=".DatePickActivity"android:theme="@style/MyDialogStyleBottom" ></activity>

b.就是控件大小问题

用的时候,发现当强制将两个控件放在一行,会导致日期或时间显示不全,无论怎么调整布局宽度,都无法显示完全,在查看源码时后看到,安卓自己的时间和日期选择器都会用到numberpicker,就可以从这里着手,它们都是FrameLayout的子类,只需要找到其中的numberpicker,进行重新调整位置就行

<span style="white-space:pre"></span>/*** 数据初始化*/private void init() {datePicker.setCalendarViewShown(false);timePicker.setIs24HourView(true);resizePikcer(datePicker);// 调整datepicker大小resizePikcer(timePicker);// 调整timepicker大小String str = getIntent().getStringExtra("date");if (TextUtils.isEmpty(str)) {System.out.println("isempty");datestrold = "";datestr = "";} else {datestr = str;datestrold = str;}}

<span style="white-space:pre"></span>/*** 调整FrameLayout大小* * @param tp*/private void resizePikcer(FrameLayout tp) {List<NumberPicker> npList = findNumberPicker(tp);for (NumberPicker np : npList) {resizeNumberPicker(np);}}

<span style="white-space:pre"></span>/** 调整numberpicker大小*/private void resizeNumberPicker(NumberPicker np) {LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(Util.dip2px(this, 45),LayoutParams.WRAP_CONTENT);params.setMargins(Util.dip2px(this, 5), 0, Util.dip2px(this, 5), 0);np.setLayoutParams(params);}

<span style="white-space:pre"></span>/*** 得到viewGroup里面的numberpicker组件* * @param viewGroup* @return*/private List<NumberPicker> findNumberPicker(ViewGroup viewGroup) {List<NumberPicker> npList = new ArrayList<NumberPicker>();View child = null;if (null != viewGroup) {for (int i = 0; i < viewGroup.getChildCount(); i++) {child = viewGroup.getChildAt(i);if (child instanceof NumberPicker) {npList.add((NumberPicker) child);} else if (child instanceof LinearLayout) {List<NumberPicker> result = findNumberPicker((ViewGroup) child);if (result.size() > 0) {return result;}}}}return npList;}

DatePickActivity.java

@ContentView(R.layout.activity_date_pick)public class DatePickActivity extends Activity {@ViewInject(R.id.date_picker)private DatePicker datePicker;@ViewInject(R.id.time_picker)private TimePicker timePicker;private String datestrold;private String datestr;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);ViewUtils.inject(this);init();}/*** 数据初始化*/private void init() {datePicker.setCalendarViewShown(false);timePicker.setIs24HourView(true);resizePikcer(datePicker);// 调整datepicker大小resizePikcer(timePicker);// 调整timepicker大小String str = getIntent().getStringExtra("date");if (TextUtils.isEmpty(str)) {System.out.println("isempty");datestrold = "";datestr = "";} else {datestr = str;datestrold = str;}}/*** 实现onTouchEvent触屏函数但点击屏幕时* * @param v*/@OnClick(R.id.repair_date_other)public void exit(View v) {back(false);}/*** 调整FrameLayout大小* * @param tp*/private void resizePikcer(FrameLayout tp) {List<NumberPicker> npList = findNumberPicker(tp);for (NumberPicker np : npList) {resizeNumberPicker(np);}}/** 调整numberpicker大小*/private void resizeNumberPicker(NumberPicker np) {LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(Util.dip2px(this, 45),LayoutParams.WRAP_CONTENT);params.setMargins(Util.dip2px(this, 5), 0, Util.dip2px(this, 5), 0);np.setLayoutParams(params);}/*** 得到viewGroup里面的numberpicker组件* * @param viewGroup* @return*/private List<NumberPicker> findNumberPicker(ViewGroup viewGroup) {List<NumberPicker> npList = new ArrayList<NumberPicker>();View child = null;if (null != viewGroup) {for (int i = 0; i < viewGroup.getChildCount(); i++) {child = viewGroup.getChildAt(i);if (child instanceof NumberPicker) {npList.add((NumberPicker) child);} else if (child instanceof LinearLayout) {List<NumberPicker> result = findNumberPicker((ViewGroup) child);if (result.size() > 0) {return result;}}}}return npList;}/*** 点击取消* * @param v*/@OnClick(R.id.repair_date_sel_cancel)public void cancel(View v) {back(true);}/*** 点击确定* * @param v*/@OnClick(R.id.repair_date_sel_ok)public void ok(View v) {back(false);}/*** 处理返回按键*/@Overridepublic void onBackPressed() {back(true);super.onBackPressed();}/*** 关闭调用 old为true则不变,false则改变* * @param old是否不变*/private void back(boolean old) {// 获取时间选择Intent intent = new Intent();if (old) {intent.putExtra("date", datestrold);} else {datestr = getData();SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");try {Date date = sdf.parse(datestr);if (!compare(date))return;intent.putExtra("date", datestr);setResult(Activity.RESULT_OK, intent);} catch (ParseException e) {e.printStackTrace();}}finish();}// 比较时间private boolean compare(Date dt1) {Date curDate = new Date(System.currentTimeMillis());if (dt1.getTime() > curDate.getTime()) {System.out.println("选的时间大于现在的时间");return true;} else if (dt1.getTime() < curDate.getTime()) {Util.showToast(this, "预约时间必须大于当前时间");return false;} else {// 相等System.out.println("相等");return false;}}private String getData() {StringBuilder str = new StringBuilder().append(datePicker.getYear()).append("-").append((datePicker.getMonth() + 1) < 10 ? "0" + (datePicker.getMonth() + 1): (datePicker.getMonth() + 1)).append("-").append((datePicker.getDayOfMonth() < 10) ? "0" + datePicker.getDayOfMonth(): datePicker.getDayOfMonth()).append(" ").append((timePicker.getCurrentHour() < 10) ? "0" + timePicker.getCurrentHour(): timePicker.getCurrentHour()).append(":").append((timePicker.getCurrentMinute() < 10) ? "0" + timePicker.getCurrentMinute(): timePicker.getCurrentMinute());return str.toString();}}

activity_date_pick.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center_horizontal" ><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:background="@color/transparent"android:gravity="center_horizontal"android:orientation="vertical" ><View android:id="@+id/repair_date_other"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"/><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/igray" ><Buttonandroid:id="@+id/repair_date_sel_cancel"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:background="@color/transparent"android:text="取消"android:textColor="@color/blue"android:textSize="20sp" /><Buttonandroid:id="@+id/repair_date_sel_ok"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:background="@color/transparent"android:textColor="@color/blue"android:text="确定"android:textSize="20sp" /></RelativeLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/white"android:orientation="horizontal"><DatePickerandroid:id="@+id/date_picker"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="5"></DatePicker><TimePickerandroid:id="@+id/time_picker"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="4"android:visibility="visible"/></LinearLayout></LinearLayout></RelativeLayout>

Demo源码地址 点击打开链接

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。