告别日期选择烦恼:Android-PickerView轻松实现酒店预订日期选择器

告别日期选择烦恼:Android-PickerView轻松实现酒店预订日期选择器

【免费下载链接】Android-PickerView This is a picker view for android , support linkage effect, timepicker and optionspicker.(时间选择器、省市区三级联动) 【免费下载链接】Android-PickerView 项目地址: https://gitcode.com/gh_mirrors/an/Android-PickerView

你是否还在为酒店预订App中的日期选择功能头疼?用户抱怨选择入住离店日期时操作复杂、容易出错?本文将带你使用Android-PickerView快速实现一个流畅的酒店日期选择界面,解决日期范围限制、价格联动显示等常见痛点。

读完本文,你将掌握:

  • 基础日期选择器的快速集成
  • 入住离店日期的范围限制实现
  • 自定义日期选择器样式适配App主题
  • 日期选择与价格显示的联动处理

认识Android-PickerView

Android-PickerView是一个功能强大的Android选择器库,支持时间选择、选项选择和联动效果。它提供了丰富的自定义选项,能够轻松满足各种场景下的选择需求,尤其适合酒店、机票预订等需要日期选择的应用场景。

项目核心代码位于pickerview/src/main/java/com/bigkoo/pickerview/目录下,包含了时间选择器(TimePickerView)和选项选择器(OptionsPickerView)等核心组件。

基础日期选择器实现

首先,我们来实现一个基础的日期选择器,用于选择入住日期。Android-PickerView提供了TimePickerBuilder来快速构建日期选择器。

集成步骤

  1. 初始化日期选择器

在Activity的onCreate方法中初始化时间选择器:

private void initCheckInDatePicker() {
    //获取当前时间
    Calendar selectedDate = Calendar.getInstance();
    //设置起始日期为今天
    Calendar startDate = Calendar.getInstance();
    //设置结束日期为3个月后
    Calendar endDate = Calendar.getInstance();
    endDate.add(Calendar.MONTH, 3);
    
    //创建时间选择器
    checkInPicker = new TimePickerBuilder(this, new OnTimeSelectListener() {
        @Override
        public void onTimeSelect(Date date, View v) {
            //选中日期后的回调
            checkInDate = date;
            checkInButton.setText(getTime(date));
            //更新离店日期的起始时间
            updateCheckOutDateRange();
        }
    })
    .setType(new boolean[]{true, true, true, false, false, false}) //只显示年月日
    .setLabel("年", "月", "日", "", "", "") //设置单位标签
    .setRangDate(startDate, endDate) //设置日期范围
    .setTitleText("选择入住日期") //设置标题
    .setSubmitColor(0xFF24AD9D) //设置确认按钮颜色
    .setCancelColor(0xFF999999) //设置取消按钮颜色
    .setContentTextSize(18) //设置内容文字大小
    .build();
}

//日期格式化
private String getTime(Date date) {
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    return format.format(date);
}
  1. 在布局文件中添加触发按钮

app/src/main/res/layout/activity_main.xml中添加两个按钮用于触发入住和离店日期选择:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:layout_margin="10dp">
    
    <Button
        android:id="@+id/btn_check_in"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_weight="1"
        android:layout_marginEnd="5dp"
        android:text="选择入住日期" />
        
    <Button
        android:id="@+id/btn_check_out"
        android:layout_width="0dp"
        android:layout_height="50dp"
        android:layout_weight="1"
        android:layout_marginStart="5dp"
        android:text="选择离店日期" />
</LinearLayout>
  1. 设置按钮点击事件

在Activity的onClick方法中添加按钮点击事件处理:

@Override
public void onClick(View v) {
    if (v.getId() == R.id.btn_check_in) {
        checkInPicker.show();
    } else if (v.getId() == R.id.btn_check_out) {
        if (checkInDate == null) {
            Toast.makeText(this, "请先选择入住日期", Toast.LENGTH_SHORT).show();
            return;
        }
        checkOutPicker.show();
    }
}

入住离店日期联动限制

酒店预订中一个重要的需求是离店日期必须晚于入住日期。我们可以通过监听入住日期的选择,动态更新离店日期选择器的起始时间。

实现日期联动

private void updateCheckOutDateRange() {
    if (checkOutPicker == null) {
        initCheckOutDatePicker();
    }
    
    //设置离店日期的起始时间为入住日期+1天
    Calendar startDate = Calendar.getInstance();
    startDate.setTime(checkInDate);
    startDate.add(Calendar.DAY_OF_MONTH, 1);
    
    //设置离店日期的结束时间为入住日期+30天
    Calendar endDate = Calendar.getInstance();
    endDate.setTime(checkInDate);
    endDate.add(Calendar.DAY_OF_MONTH, 30);
    
    //更新离店日期选择器的日期范围
    checkOutPicker.setRangDate(startDate, endDate);
}

private void initCheckOutDatePicker() {
    //初始化离店日期选择器
    checkOutPicker = new TimePickerBuilder(this, new OnTimeSelectListener() {
        @Override
        public void onTimeSelect(Date date, View v) {
            checkOutDate = date;
            checkOutButton.setText(getTime(date));
            //计算并显示价格
            calculatePrice();
        }
    })
    .setType(new boolean[]{true, true, true, false, false, false})
    .setLabel("年", "月", "日", "", "", "")
    .setTitleText("选择离店日期")
    .setSubmitColor(0xFF24AD9D)
    .setCancelColor(0xFF999999)
    .setContentTextSize(18)
    .build();
}

自定义日期选择器样式

为了让日期选择器与App的整体风格保持一致,我们可以自定义选择器的样式。Android-PickerView支持通过setLayoutRes方法自定义布局。

自定义布局实现

  1. 创建自定义布局文件

app/src/main/res/layout/目录下创建pickerview_hotel_date.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <!--标题栏-->
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#f5f5f5">

        <TextView
            android:id="@+id/tv_cancel"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_alignParentLeft="true"
            android:gravity="center"
            android:paddingHorizontal="15dp"
            android:text="取消"
            android:textColor="#666666"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/tv_title"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:text="选择日期"
            android:textColor="#333333"
            android:textSize="18sp"
            android:textStyle="bold" />

        <TextView
            android:id="@+id/tv_confirm"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_alignParentRight="true"
            android:gravity="center"
            android:paddingHorizontal="15dp"
            android:text="确定"
            android:textColor="#24AD9D"
            android:textSize="16sp" />
    </RelativeLayout>

    <!--日期选择器主体-->
    <LinearLayout
        android:id="@+id/timepicker"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:background="@android:color/white"
        android:gravity="center"
        android:orientation="horizontal">

        <com.contrarywind.view.WheelView
            android:id="@+id/year"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <com.contrarywind.view.WheelView
            android:id="@+id/month"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />

        <com.contrarywind.view.WheelView
            android:id="@+id/day"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1" />
    </LinearLayout>
    
    <!--价格提示栏-->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="#f9f9f9"
        android:gravity="center"
        android:orientation="horizontal"
        android:paddingHorizontal="15dp">
        
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="参考均价:"
            android:textColor="#666666"
            android:textSize="14sp" />
            
        <TextView
            android:id="@+id/tv_price"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:gravity="center"
            android:text="¥399/晚"
            android:textColor="#ff6600"
            android:textSize="14sp"
            android:textStyle="bold" />
    </LinearLayout>
</LinearLayout>
  1. 使用自定义布局

修改日期选择器的初始化代码,使用自定义布局:

checkInPicker = new TimePickerBuilder(this, new OnTimeSelectListener() {
    @Override
    public void onTimeSelect(Date date, View v) {
        //日期选择回调处理
    }
})
.setType(new boolean[]{true, true, true, false, false, false})
.setLabel("年", "月", "日", "", "", "")
.setRangDate(startDate, endDate)
.setLayoutRes(R.layout.pickerview_hotel_date, new CustomListener() {
    @Override
    public void customLayout(View v) {
        //自定义布局的事件处理
        final TextView tvCancel = v.findViewById(R.id.tv_cancel);
        final TextView tvConfirm = v.findViewById(R.id.tv_confirm);
        final TextView tvTitle = v.findViewById(R.id.tv_title);
        final TextView tvPrice = v.findViewById(R.id.tv_price);
        
        tvTitle.setText("选择入住日期");
        tvPrice.setText("¥399/晚");
        
        tvCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                checkInPicker.dismiss();
            }
        });
        
        tvConfirm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                checkInPicker.returnData();
                checkInPicker.dismiss();
            }
        });
    }
})
.build();

日期选择与价格联动

在酒店预订场景中,选择不同的日期可能会有不同的价格(如周末价、节假日价等)。我们可以通过OnTimeSelectChangeListener来监听日期滚动事件,实时更新价格信息。

private void initPriceLinkedDatePicker() {
    checkInPicker = new TimePickerBuilder(this, new OnTimeSelectListener() {
        @Override
        public void onTimeSelect(Date date, View v) {
            //日期选中处理
        }
    })
    .setType(new boolean[]{true, true, true, false, false, false})
    .setTimeSelectChangeListener(new OnTimeSelectChangeListener() {
        @Override
        public void onTimeSelectChanged(Date date) {
            //日期滚动时的实时回调
            updatePriceInfo(date);
        }
    })
    .setLayoutRes(R.layout.pickerview_hotel_date, new CustomListener() {
        @Override
        public void customLayout(View v) {
            //自定义布局处理
            final TextView tvPrice = v.findViewById(R.id.tv_price);
            
            //初始价格显示
            tvPrice.setText("¥399/晚");
            
            //其他事件处理...
        }
    })
    .build();
}

//根据日期更新价格信息
private void updatePriceInfo(Date date) {
    //这里可以根据实际日期查询价格
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
    
    String priceText;
    //周末价格上浮
    if (dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.SUNDAY) {
        priceText = "¥459/晚";
    } else {
        priceText = "¥399/晚";
    }
    
    //更新价格显示
    if (customPriceView != null) {
        customPriceView.setText(priceText);
    }
}

完整示例代码

完整的酒店日期选择实现可以参考项目中的app/src/main/java/com/bigkoo/pickerviewdemo/MainActivity.java文件,该文件展示了各种PickerView的用法,包括时间选择器、选项选择器等。

效果展示

使用Android-PickerView实现的酒店日期选择器效果如下:

日期选择器效果

这个日期选择器具有以下特点:

  • 简洁明了的界面,符合用户习惯
  • 入住离店日期联动限制,防止逻辑错误
  • 实时价格提示,提升用户体验
  • 完全自定义的样式,适应App主题

总结

通过Android-PickerView,我们可以快速实现一个高质量的酒店日期选择器,满足用户在预订过程中的核心需求。本文介绍的实现方案不仅适用于酒店预订,还可以举一反三应用到机票预订、电影票购买等其他需要日期选择的场景。

Android-PickerView提供了丰富的自定义选项,开发者可以根据App的具体需求灵活配置,打造出既美观又实用的选择器组件。更多高级用法可以参考项目的官方文档和示例代码。

希望本文能够帮助你解决酒店预订中的日期选择难题,提升App的用户体验和转化率!

【免费下载链接】Android-PickerView This is a picker view for android , support linkage effect, timepicker and optionspicker.(时间选择器、省市区三级联动) 【免费下载链接】Android-PickerView 项目地址: https://gitcode.com/gh_mirrors/an/Android-PickerView

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值