安卓自定义控件:双日期选择Dialog实现

4 下载量 199 浏览量 更新于2024-08-30 收藏 189KB PDF 举报
"这篇资源介绍了如何在Android平台上实现一个自定义的双日期选择对话框,该对话框允许用户同时选择开始日期和结束日期,并且可以隐藏日份,仅显示年和月。开发者基于DatePickerDialog进行了扩展,提高了在平板等大屏幕设备上的用户体验。" 在Android开发中,常常需要为用户提供了选择日期的功能。`DatePickerDialog`是Android SDK提供的一种标准方式,用于让用户在弹出的对话框中选择日期。然而,当需要用户同时设置开始和结束日期时,`DatePickerDialog`默认的实现可能不够直观或高效。在这种情况下,开发者可以自定义视图来满足特定需求。 这个自定义的`DoubleDatePicker`项目首先创建了一个新的XML布局文件`date_picker_dialog.xml`,位于`res/layout`目录下。布局文件采用`LinearLayout`作为根视图,设置了水平方向的布局,以便并排放置两个日期选择器。每个日期选择器内部又包含一个垂直布局,包含一个`TextView`显示日期提示(如“开始日期”和“结束日期”),以及一个`DatePicker`组件。 `DatePicker`的配置中,`android:id`用于标识这个日期选择器,方便在代码中找到它进行操作。`android:layout_width`和`android:layout_height`通常设为`wrap_content`,让其自动适应内容大小。`android:calendarViewShown="false"`属性可以隐藏默认的日历视图,使得用户只能通过数字滚轮选择年、月、日,更便于快速选择。 在Java代码中,开发者需要创建`DatePickerDialog`的实例,设置相应的日期范围,并监听用户的日期选择事件。为了实现双日期选择,需要创建两个`DatePickerDialog`对象,分别关联到XML布局中的`@+id/datePickerStart`和`@+id/datePickerEnd`。同时,可能需要添加额外的逻辑来确保结束日期不会早于开始日期,并处理用户的选择变化。 此外,为了实现对话框的显示,可以使用`AlertDialog.Builder`,将`date_picker_dialog.xml`作为内容视图,然后调用`create()`和`show()`方法来创建并显示对话框。在点击确认按钮时,可以通过`DatePicker`的`getYear()`, `getMonth()`, `getDayOfMonth()`方法获取选定的日期,并进行后续的业务处理。 这个资源提供了一种在Android应用中实现高效双日期选择的实践案例,对于提升用户在选择日期时的交互体验具有参考价值。开发者可以根据自己的需求进一步定制这个对话框,例如添加日期验证规则,或者调整视觉样式。
2013-08-28 上传
public class Android_DateActivity extends Activity implements OnClickListener { /** Called when the activity is first created. */ private Button button; private TextView textview; private Dialog mdialog; private Calendar calendar = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); initUi(); button.setOnClickListener(this); } public void initUi() { button = (Button) findViewById(R.id.button); textview = (TextView) findViewById(R.id.textview); } @Override public void onClick(View v) { // TODO Auto-generated method stub showDialog(0);// 日期弹出框 int SDKVersion = Android_DateActivity.this.getSDKVersionNumber();// 获取系统版本 System.out.println("SDKVersion = " + SDKVersion); DatePicker dp = findDatePicker((ViewGroup) mdialog.getWindow() .getDecorView());// 设置弹出年月日 if (dp != null) { if (SDKVersion 14) { ((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0)) .getChildAt(1).setVisibility(View.GONE); } } } @Override protected Dialog onCreateDialog(int id) { // 对应上面的showDialog(0);//日期弹出框 mdialog = null; switch (id) { case 0: calendar = Calendar.getInstance(); mdialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() { @Override public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { textview.setText(year + "-" + (monthOfYear + 1)); } }, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH)); break; } return mdialog; } /** * 从当前Dialog中查找DatePicker子控件 * * @param group * @return */ private DatePicker findDatePicker(ViewGroup group) { if (group != null) { for (int i = 0, j = group.getChildCount()