最近做的项目需要写一写日历控件这个东西,起初在网上找一些资料发现很多资料都是比较繁琐复杂,基本都是自定义控件来写的,天知道你即使画出来日历控件,你对于日历本身的判断是很耗费精力的,而且很多的demo我发现根本就不能点击上面的日期,根本就达不到自己的要求。不过后来我在网上下载了一些框架,然后自己对框架进行了很多的改写,最终还是达到了我需要的效果。网上很多的大神啊,写了让我们这些小白看不懂的文章。我只能呵呵一笑,用框架。下面贴出我的效果图。
其实这个实现起来是非常非常的简单的,下面我贴出工程结构图。
实现这个效果有以下几个步骤:
一、首先导入架包,架包下载地址http://download.csdn.net/detail/u014128885/8704433至于导入架包的方法请参考以前写的侧滑效果那个博客吧,网页地址 http://blog.csdn.net/u014128885/article/details/45064967本来不想给demo的,想了一下伸手党们,还是给你们吧demo地 址http://download.csdn.net/detail/u014128885/8704549
二、如果你成功导入架包之后呢,就可以开始编写java代码了。首先我贴出MainActivity的代码:
package com.yuriko.shijian;
import com.pickerview.TimePopupWindow;
import com.pickerview.TimePopupWindow.Type;
import com.yuriko.yurikotest.R;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Gravity;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;
public class ShiJianActivity extends Activity{
private TextView tvShiJian;
private TimePopupWindow popupWindow;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.shijian);
tvShiJian=(TextView)findViewById(R.id.tvShiJian);
//type有五种类型对应的get方法只写了三种,需要的话可以自己写,到时只需要改掉get方法就行
//改写显示是年月日还是时分秒等。
popupWindow = new TimePopupWindow(this, Type.DAY_HOUR_MIN);
//tvShiJian控件获取时间
tvShiJian.setText("招聘截止时间:"+popupWindow.getTime2());
//里面的layout是指这个布局文件,需要给布局文件设置id属性,当然这个布局放在哪里要看你怎么放置。
findViewById(R.id.layout).post(new Runnable() {
@Override
public void run() {
//显示该控件
popupWindow.showAtLocation(findViewById(R.id.layout), Gravity.CENTER, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, null);
}
});
//注册广播
registerReceiver(receiver, new IntentFilter(TimePopupWindow.UPDATE_TIME));
}
//广播
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(TimePopupWindow.UPDATE_TIME)) {
tvShiJian.setText("招聘截止时间:"+popupWindow.getTime2());
}
}
};
//回调(直接拷贝即可,注意receiver广播)
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
}
三、布局文件
<?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="match_parent"
android:orientation="vertical"
android:id="@+id/layout" >
<TextView
android:id="@+id/tvShiJian"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"/>
</LinearLayout>
好了这样就能做出那种效果了,可能大家想要那种非滚动的日历控件,这个下次更新吧。
下面我来说说这个框架怎么改写成自己的东西。
其实大家引用这个框架最关键的是popupWindow = new TimePopupWindow(this, Type.DAY_HOUR_MIN);这句代码,这个很关键,没有它你什么都不能做到,当我们点击进去的时候会看到一个枚举,这个枚举就决定了你可以使用多少个类型。类型可以自己去定义。下面我来教大家如何定义这个枚举。
1、首先肯定要在这个枚举里面添加你想要的字段,字段的名称随便自己取,但是最好是通俗易懂的。
2、找到WheelTime这个类。然后需要找到如下的代码块:你需要把你所定义的这个名字写进去,其实就是添加一个case选项而已,照着上面画就行,里面的最后一个case是我自己添加的,上面解释的也很详细,我就不多说了。textSize是用来改变你显示的字体大小的,忘写了。
switch(type){
case ALL:
textSize = (screenheight / 100) * 3;
break;
case YEAR_MONTH_DAY:
textSize = (screenheight / 100) * 4;
wv_hours.setVisibility(View.GONE);
wv_mins.setVisibility(View.GONE);
break;
case HOURS_MINS:
textSize = (screenheight / 100) * 4;
wv_year.setVisibility(View.GONE);
wv_month.setVisibility(View.GONE);
wv_day.setVisibility(View.GONE);
break;
case MONTH_DAY_HOUR_MIN:
textSize = (screenheight / 100) * 3;
wv_year.setVisibility(View.GONE);
break;
//DAY_HOUR_MIN是个类型,在上面的type里面有此字段,
//不需要显示的使用wv_year.setVisibility(View.GONE);类似代码去掉显示即可
case DAY_HOUR_MIN:
textSize = (screenheight / 100) * 4;
wv_year.setVisibility(View.GONE);
wv_month.setVisibility(View.GONE);
break;
}
最后一步的设置联动监听我已经全部写好了,大家不需要改动了,这里就不展示了。这样就算是添加一种类型了,但是虽然添加了我们还不能显示呢,下面我为大家来解释一下如何显示。
这里的关键代码在tvShiJian.setText("招聘截止时间:"+popupWindow.getTime2()); 其实我们跟进去看的时候发现返回的就是一个String类型的方法,继续跟进去我们就会发现玄机了。这个方法其实就是显示你现在的格式。比方说getTime2()这个方法就会显示__日__时__分这种格式的日期和时间。getTime1()就会显示__年__月__日,当然主要是看你怎么写的,这两个方法都是我自己添加的。所以这两个类里面的方法都需要再写一个就能做出这样的效果了。