您的位置:首页 > 移动开发 > Android开发

Android 日期选择器隐藏年,月,日

2016-04-06 11:15 441 查看
业务场景如下:类中有一个显示 yyyy-mm日期格式的组件。点击组件 弹出日期选择器弹出框,当选择好日期确定 可以对组件重新赋值,弹出框默认显示为上一次选择的日期。选择的时间不能大于当前时间。

源码如下:

package net.demo.shijianxuanze;

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Calendar;

import java.util.Date;

import android.app.Activity;

import android.app.DatePickerDialog;

import android.app.DatePickerDialog.OnDateSetListener;

import android.content.Context;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.widget.DatePicker;

import android.widget.RelativeLayout;

import android.widget.TextView;

import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {
TextView tv_time;//显示选择日期
private Calendar calendar;// 用来装日期的
CusDatePicDialog dialog; //日期选择弹出框
RelativeLayout linearlayout_biaoti;//点击位置,弹出弹出框

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_time=(TextView) findViewById(R.id.tv_time);
linearlayout_biaoti=(RelativeLayout) findViewById(R.id.linearlayout_biaoti);
linearlayout_biaoti.setOnClickListener(this);
calendar = Calendar.getInstance();
//初始化 首先获取到当前系统时间,对textView 赋值。
int month = calendar.get(Calendar.MONTH) + 1;//得到的月份要+1.以为Android 月份是从0开始,代表咱们的1
String time = calendar.get(Calendar.YEAR) + "-" + month;
tv_time.setText(time);
}

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()){
case R.id.linearlayout_biaoti:

calendar = Calendar.getInstance();
String s=tv_time.getText().toString().trim();
//将tv_time 显示的字符串类型日期,转换为 时间格式。
Date date=getnianyue(s);
//防止出现空异常。做个判断,我觉得基本不会出现空异常
if(date==null){
dialog = new CusDatePicDialog(MainActivity.this,
new DatePickerDialog.OnDateSetListener() {

@Override
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
// TODO Auto-generated method stub
String newtime=year + "-" + (monthOfYear + 1);
String oldtime=calendar.get(Calendar.YEAR)+"-"+
(calendar.get(Calendar.MONTH)+1);
////如果参数1大于参数2 ,返回false
boolean flag=comparetimess(newtime,oldtime);
if(flag){//如果参数1大于参数2 ,返回false
tv_time.setText(year + "-" + (monthOfYear + 1));

}
else{
Toast.makeText(MainActivity.this,
"选择时间不能大于当前时间",1000).show();
return;
}

}
}, calendar.get(Calendar.YEAR),
calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE));
}else{
//获取到 字符串转换为时间的 年,和月,,其实就是想让弹出框显示的年月是你上一次选择的年月
int year=date.getYear();

year=year+1900;//得到的年是 相对于1900年的差,所以要+1900
int month=date.getMonth();
month=month;
dialog = new CusDatePicDialog(MainActivity.this,
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
// TODO Auto-generated method stub
//获取到你选择 的时间
String newtime=year + "-" + (monthOfYear + 1);
//获取到当前系统时间
String oldtime=calendar.get(Calendar.YEAR)+"-"+
(calendar.get(Calendar.MONTH)+1);
////如果参数1大于参数2 ,返回false 选择时间不能超过当前时间。
boolean flag=comparetimess(newtime,oldtime);
if(flag){////如果参数1大于参数2 ,返回false
tv_time.setText(year + "-" + (monthOfYear + 1));
}
else{
Toast.makeText(MainActivity.this,
"选择时间不能大于当前时间",1000).show();
return;
}
}
}, year,month,5);
}

//显示弹出框
dialog.show();
dialog.setTitle("请选择日期");
//得到dialog 内部组件
DatePicker dp = findDatePicker((ViewGroup) dialog.getWindow()
.getDecorView());
//这部分效果实现,当时原理还是不太懂。。
if (dp != null) {

//不让年显示
/*((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0))
.getChildAt(0).setVisibility(View.GONE);*/
//不让月显示
/*((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0))
.getChildAt(1).setVisibility(View.GONE);*/
// 不让 日显示
((ViewGroup) ((ViewGroup) dp.getChildAt(0)).getChildAt(0))
.getChildAt(2).setVisibility(View.GONE);
}
break;
}

}

private DatePicker findDatePicker(ViewGroup group) {
if (group != null) {
for (int i = 0, j = group.getChildCount(); i < j; i++) {
View child = group.getChildAt(i);
if (child instanceof DatePicker) {
return (DatePicker) child;
} else if (child instanceof ViewGroup) {
DatePicker result = findDatePicker((ViewGroup) child);
if (result != null)
return result;
}
}
}
return null;

}
/**
* @author 作者:xx 方法描述: 字符串转换成日期
* @return
*/
public static Date getnianyue(String param) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
Date date = null;
try {
date = sdf.parse(param);// 把字符串转换成日期
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return date;

}
// 重写DatePickerDialog 为了一直让标题内容不变
class CusDatePicDialog extends DatePickerDialog {

          //这里面后三个参数是为了初始化 dialog的内容
public CusDatePicDialog(Context context, OnDateSetListener callBack,
int year, int monthOfYear, int dayOfMonth) {
super(context, callBack, year, monthOfYear, dayOfMonth);
// TODO Auto-generated constructor stub
}

@Override
public void onDateChanged(DatePicker view, int year, int month, int day) {
// TODO Auto-generated method stub
super.onDateChanged(view, year, month, day);
dialog.setTitle("请选择日期");
}

}
/**

* @author 作者:xx 方法描述:比较两个时间的大小 time1>time2 返回false time1<time2 返回true

* @param 参数描述
*            格式为yyyy年MM月dd日 HH:mm:ss
* @return 返回值描述
* @throws <异常类型> {@inheritDoc} 异常描述
*/

public static Boolean comparetimess(String time1, String time2) {
java.text.DateFormat df = new java.text.SimpleDateFormat(
"yyyy-MM");
java.util.Calendar c1 = java.util.Calendar.getInstance();
java.util.Calendar c2 = java.util.Calendar.getInstance();
try {
c1.setTime(df.parse(time1));
c2.setTime(df.parse(time2));
int result = c1.compareTo(c2);
if (result <= 0) {
return true;
} else {
return false;
}
} catch (Exception e) {

}
return false;

}

}

布局文件如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

     >

    <RelativeLayout

        android:id="@+id/linearlayout_biaoti"

        android:layout_width="match_parent"

        android:layout_height="40dp"

        

       android:layout_below="@+id/shebei_duibi_titlebar"

       android:background="@drawable/shape_xlist_item_hui"

       android:layout_marginLeft="2dp"

       android:layout_marginRight="2dp"

       android:gravity="center"

       android:layout_marginTop="5dp"

        >

        <TextView

            android:id="@+id/tv_time"

            android:layout_width="55dp"

           android:layout_height ="wrap_content"

         android:gravity="center"

           android:text="123"

           android:layout_centerVertical="true"

           

           />

        <ImageView 

            android:layout_width="wrap_content"

            android:layout_height="wrap_content"

            android:src="@drawable/xia"

            android:layout_centerVertical="true"

            android:layout_toRightOf="@id/tv_time"

            />

    </RelativeLayout>

</RelativeLayout>



背景如下:

<?xml version="1.0" encoding="utf-8"?>

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >

    <solid

        android:color="#f8f8f8" >

    </solid>

    <stroke 

        android:width="1dp"

        android:color="#777777"

        />

    

</shape>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息