`
喧嚣求静
  • 浏览: 550667 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

android自定义控件或属性-日期时间选择框

阅读更多
关于自定义控件或属性
请转此学习
看代码之前先看看效果图
时间选择

使用方法:配置为时间(dateTime:dateFormatStr="HH:mm:ss" dateTime:dateFormat="time")
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:dateTime="http://schemas.android.com/apk/res/com.app"/>

 <com.app.view.DatePickText  android:layout_marginLeft="7dp"   android:layout_width="230dp" android:layout_height="35dp" 
	     android:id="@+id/v_birthday" dateTime:dateFormatStr="HH:mm:ss" dateTime:dateFormat="time"/>

看代码之前先看看效果图

日期选择

使用方法:配置为日期(dateTime:dateFormatStr="yyyy-MM-dd" dateTime:dateFormat="date")
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:dateTime="http://schemas.android.com/apk/res/com.app"/>

 <com.app.view.DatePickText  android:layout_marginLeft="7dp"   android:layout_width="230dp" android:layout_height="35dp" 
	     android:id="@+id/v_birthday" dateTime:dateFormatStr="yyyy-MM-dd" dateTime:dateFormat="date"/>

res/values/attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="DatePickText">  
       
        <attr name="dateFormatStr" format="string"/>
        <attr name="dateFormat" > 
              <!-- yyyy-MM-dd  --> 
	         <enum name="date" value="0" />
	         <!-- HH:mm:ss -->
	         <enum name="time" value="1" />
	     </attr>
      
    </declare-styleable>  
</resources>

实现类
package com.app.view;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TimePicker;

import com.app.R;

public class DatePickText extends LinearLayout {

   private Integer dateFormat;
   private String layout_height,layout_width;
   private String dateFormatStr;
   private EditText edit;
   private ImageButton btn_date;
   private LinearLayout layout;
    public static final int TOP = 0;
	public static final int BOTTOM = 1;
	public static final int LEFT = 2;
	public static final int RIGHT = 3;
	
	public static final int DATE = 0;
	public static final int TIME = 1;
	private SimpleDateFormat df ;
	private final Calendar cal = Calendar.getInstance(Locale.SIMPLIFIED_CHINESE);
	
	public DatePickText(Context context) {
		super(context);
		
	}

	

	public DatePickText(Context context, AttributeSet attrs) {
		super(context, attrs);
		
		TypedArray typeA =context.obtainStyledAttributes(attrs, R.styleable.DatePickText);
		
		layout_height=typeA.getString(R.styleable.DatePickText_layout_height);
		layout_width=typeA.getString(R.styleable.DatePickText_layout_width);
		 dateFormatStr=typeA.getString(R.styleable.DatePickText_dateFormatStr);
		 dateFormat=typeA.getInteger(R.styleable.DatePickText_dateFormat,DATE);
		//typeA.g
		 
	 LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	 layoutInflater.inflate(R.layout.date_pick_txt,this);
	 layout=(LinearLayout)findViewById(R.id.date_linear);
	 edit=(EditText)findViewById(R.id.date_txt);
	 btn_date=(ImageButton)findViewById(R.id.date_btn);
	 
	 processUi(context);
	}
   
	private void processUi(final Context context){
		//ViewGroup.LayoutParams params=new ViewGroup.LayoutParams(params);
		//layout.setLayoutParams(params);
		
		btn_date.setOnClickListener(new OnClickListener(){
         
			@Override
			public void onClick(View v) {
				System.out.println("-------------click------------");
				buildDateOrTimeDialog(context);
				
			}
			
		});
		
	}
	private void buildDateOrTimeDialog(Context context){
		df = new SimpleDateFormat(dateFormatStr);
		
		switch(dateFormat)
		{
		case DATE:
			 date:
				new DatePickerDialog( context,listener ,
					cal .get(Calendar. YEAR ),
					 
					cal .get(Calendar. MONTH ),
					 
					cal .get(Calendar. DAY_OF_MONTH )
					 
					).show();
			break;
					 
		case TIME:
			System.out.println("----------time---------------");
			 new TimePickerDialog(context,timeListen,cal.get(Calendar.HOUR_OF_DAY),cal.get(Calendar.MINUTE),true).show();
			 break;
		default:
			new DatePickerDialog( context,listener ,
					cal .get(Calendar. YEAR ),
					 
					cal .get(Calendar. MONTH ),
					 
					cal .get(Calendar. DAY_OF_MONTH )
					 
					).show();
			
		}
	
}
		
	
private DatePickerDialog.OnDateSetListener listener = new DatePickerDialog.OnDateSetListener(){  //
	 
	@Override
	 
	public void onDateSet(DatePicker arg0, int arg1, int arg2, int arg3) {
	 
	cal .set(Calendar. YEAR , arg1);
	 
	cal .set(Calendar. MONTH , arg2);
	 
	cal .set(Calendar. DAY_OF_MONTH , arg3);
	 
	updateDate();
	 
	}
	 
	};
	
	// 当 DatePickerDialog 关闭,更新日期显示
	 
	private void updateDate(){
	 
		  edit.setText( df .format( cal .getTime()));
	 
	}
	
	TimePickerDialog.OnTimeSetListener timeListen = new TimePickerDialog.OnTimeSetListener() {

		//同DatePickerDialog控件

		@Override
		public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
			cal.set(Calendar.HOUR_OF_DAY, hourOfDay);
			cal.set(Calendar.MINUTE, minute);
			cal.set(Calendar.SECOND, cal.get(Calendar.SECOND));
		  updateTimes();
		}

	

		};
		
		//更新页面TextView的方法
	private void updateTimes() {
	
			edit.setText(df.format(cal.getTime()));
	}
}


实现类中用到的布局文件
date_pick_txt.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="horizontal" android:id="@+id/date_linear"
  android:layout_width="230dp"
  android:layout_height="35dp">
   <RelativeLayout android:id="@+id/date_relative" android:layout_height="fill_parent" android:layout_width="fill_parent">
       <EditText  android:id="@+id/date_txt" android:editable="false" android:layout_height="fill_parent" android:layout_width="fill_parent"
             android:includeFontPadding="false" android:hint="yyyy-mm-dd"/>
             <ImageButton android:src="@drawable/date_pic" android:layout_width="28dp" android:layout_marginLeft="-33dp" 
            android:layout_alignBottom="@+id/date_txt"   android:layout_centerInParent="true" android:layout_centerHorizontal="true"
          android:layout_height="26dp" android:layout_toRightOf="@+id/date_txt" android:id="@+id/date_btn"/>/
       
    </RelativeLayout>
 
    
</LinearLayout>


  • 大小: 70.4 KB
  • 大小: 58.9 KB
分享到:
评论
6 楼 喧嚣求静 2013-05-05  
javaxhw 写道
代码里面的 :R.declare-styleable.DatePickText
eclipse提示找不到啊?咋回事

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="DatePickText">   
        
        <attr name="dateFormatStr" format="string"/> 
        <attr name="dateFormat" >  
              <!-- yyyy-MM-dd  -->  
             <enum name="date" value="0" /> 
             <!-- HH:mm:ss --> 
             <enum name="time" value="1" /> 
         </attr> 
       
    </declare-styleable>   
</resources> 

5 楼 喧嚣求静 2013-05-05  
javaxhw 写道
javaxhw 写道
代码里面的 :R.declare-styleable.DatePickText
eclipse提示找不到啊?咋回事

找不到R.styleable.DatePickText_layout_height

<com.app.view.DatePickText  android:layout_marginLeft="7dp"   android:layout_width="230dp" android:layout_height="35dp"  
         android:id="@+id/v_birthday" dateTime:dateFormatStr="yyyy-MM-dd" dateTime:dateFormat="date"/> 

layout_height是android原有属性,在使用自定义组件时,填上就可。
4 楼 javaxhw 2012-11-10  
javaxhw 写道
代码里面的 :R.declare-styleable.DatePickText
eclipse提示找不到啊?咋回事

找不到R.styleable.DatePickText_layout_height
3 楼 javaxhw 2012-11-10  
代码里面的 :R.declare-styleable.DatePickText
eclipse提示找不到啊?咋回事
2 楼 喧嚣求静 2012-08-24  
endual 写道
这个正好是我要的效果呵呵,就是把代码复制下来错误了。
哎。。。,这个自定义的xml第一次用,所以不太懂。
多谢多谢

是不是,引用到图片资源没有,这个只要同名,你随便给个图片就可
1 楼 endual 2012-06-19  
这个正好是我要的效果呵呵,就是把代码复制下来错误了。
哎。。。,这个自定义的xml第一次用,所以不太懂。
多谢多谢

相关推荐

Global site tag (gtag.js) - Google Analytics