时间设置对话框DatePickerDialog的使用
package www.com;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.DatePickerDialog.OnDateSetListener;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.TextView;
public class TestClock extends Activity implements OnDateSetListener, OnClickListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn = (Button)findViewById(R.id.date);
btn.setOnClickListener(this);
}
public void onClick(View v) {//普通按钮事件
Calendar d = Calendar.getInstance(Locale.CHINA);
//创建一个日历引用d,通过静态方法getInstance() 从指定时区 Locale.CHINA 获得一个日期实例
Date myDate=new Date();
//创建一个Date实例
d.setTime(myDate);
//设置日历的时间,把一个新建Date实例myDate传入
int year=d.get(Calendar.YEAR);
int month=d.get(Calendar.MONTH);
int day=d.get(Calendar.DAY_OF_MONTH);
//获得日历中的 year month day
DatePickerDialog dlg=new DatePickerDialog(this,this,year,month,day);
//新建一个DatePickerDialog 构造方法中
// (设备上下文,OnDateSetListener时间设置监听器,默认年,默认月,默认日)
dlg.show();
//让DatePickerDialog显示出来
}
public void onDateSet(DatePicker view, int year, int monthOfYear,int dayOfMonth){
//DatePickerDialog 中按钮Set按下时自动调用
TextView txt = (TextView) findViewById(R.id.text);
//通过id获得TextView对象
txt.setText(Integer.toString(year) + "-" +
Integer.toString(monthOfYear) + "-" +
Integer.toString(dayOfMonth));
//设置text
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
android:id="@+id/text"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/date"
android:text="設置時間"
>
</Button>
</LinearLayout>
今天在CocoaChina上面看到有人在问倒计时怎么做,记得以前在看Iphone31天的时候做过一个,今天翻出来运行不了了,原因是我的Iphone SDK升级到3.1了,以前使用的是2.2.1,在2.2.1里面是可以使用NSCalendarDate的,但是在3.1里面不能够使用,怎么办,只好用NSTimer了,最后还是给实现了。代码也比较简单,开始运行viewDidLoad的时候加载 [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:YES];//使用timer定时,每秒触发一次
,然后就是写selector了。
- (void)timerFireMethod:(NSTimer*)theTimer
{
//NSDateFormatter *dateformatter = [[[NSDateFormatter alloc]init] autorelease];//定义NSDateFormatter用来显示格式
//[dateformatter setDateFormat:@"yyyy MM dd hh mm ss"];//设定格式
NSCalendar *cal = [NSCalendar currentCalendar];//定义一个NSCalendar对象
NSDateComponents *shibo = [[NSDateComponents alloc] init];//初始化目标时间(好像是世博会的日期)
[shibo setYear:2010];
[shibo setMonth:5];
[shibo setDay:1];
[shibo setHour:8];
[shibo setMinute:0];
[shibo setSecond:0];
NSDate *todate = [cal dateFromComponents:shibo];//把目标时间装载入date
[shibo release];
// NSString *ssss = [dateformatter stringFromDate:dd];
// NSLog([NSString stringWithFormat:@"shibo shi:%@",ssss]);
NSDate *today = [NSDate date];//得到当前时间
// NSString *sss = [dateformatter stringFromDate:today];
// NSLog([NSString stringWithFormat:@"xianzai shi:%@",sss]);
//用来得到具体的时差
unsigned int unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDateComponents *d = [cal components:unitFlags fromDate:today toDate:todate options:0];
lab.text = [NSString stringWithFormat:@"%d年%d月%d日%d时%d分%d秒",[d year],[d month], [d day], [d hour], [d minute], [d second]];
}
这样就实现了倒计时的功能。
原文:http://blog.sina.com.cn/s/blog_60b45f230100f3v2.html
先引用第一个讲述Kuix事件机制的原文(虽然我引用的地址不一定是最初的原文)
http://niuwa.org/2008/09/03/kuix的事件处理机制/
上面引用了原文的事件处理机制的原理图,要理解Kuix的事件处理机制,建议查看KuixCanvas原文,并参照此图。
上面的文章是为数不多的Kuix中文讲解之一,我很早就浏览过了,当时只是粗略看了一下,由于没有太多兴趣研究其源代码,并没有作细致了解,之后在项目中碰到不少问题,都和Kuix的事件处理机制关联,这里结合发现的问题做一点讲解。
问题一 ScrollPane.bestScrollToChild 为何不生效
在我的程序中有这样一个UI,从服务器接收到用户资料后,通过代码添加到列表(scrollPanel)中,以便用户可以选择列表中的项目,因为列表过长,所以添加完毕后滚动条会自动滚动到最后,我需要让滚动条自动滚动到页首。ScrollPane提供了bestScrollToChild,我的代码如下:
ScrollPane main=(ScrollPane)screen.getWidget("main"); main.bestScrollToChild(screen.getWidget("selUserName"), false);
其中main是ScrollPane,selUserName是页首的一个控件,bestScrollToChild函数有两个参数,第一个是需要显示的widget,第二个是滚动间隔,为true是向要显示的widget滚动越滚动条1/4的高度,函数返回widget滚动后是否可见,为false时直接滚动到widget。单独执行上面的代码,确实可以让滚动条回到页首,但是在动态添加了列表后执行上面的代码,滚动条还是到页尾,debug发现,调用上述代码后确实调用ScrollPanel.setYOffset(私有函数)滚动到页首,但是随后又被doLayout函数调用setYOffset再次滚动到页尾,那么肯定是某种机制导致页面需要重新“布局”,无疑应该是上面添加列表导致的了,而且这个效果有一定的延迟,很可能是多线程导致的。实际上就是上图的worker线程,实际上worker是KuixCanvas的一个私有成员,KuixCanvas一开始看名字很像一个Kuix的Canvas基类,实际上是FrameWork的一个后台消息处理线程,在Kuix类中实例化,可以用Kuix.getCanvas()获得。在调用Widget.add添加控件时,发送了一个消息给处理线程,因为添加后容器的大小发生变化,需要重新布局,而doLayout后导致滚动条又一次移动到页尾。那么显然需要一个函数“提醒”消息处理线程处理完所有消息,再继续上面的代码,查看KuixCanvas的代码,发现它提供了revalidateAsSoonAsPossible函数:
/** * Revalidate (and repaint) the desktop as soon as possible. If the current * thread is the worker thread the task is done immedialty else it is * deferred to the next frame. */ public void revalidateAsSoonAsPossible() { if (!Worker.instance.isCurrentThread()) { revalidateNextFrame(); } else { forceRevalidate(); forceRepaint(); } }
revalidateNextFrame是弹出新的额窗口时才会调用的,所以应该是forceRevalidate
/** * Force desktop to be revalidated */ private void forceRevalidate() { needToRevalidate = false; // Tag as needToRevalidate = false first, because the revalidate process could cause invalidation desktop.revalidate(); if (needToRevalidate) { forceRevalidate(); } }
/**
* Revalidate the Desktop */ public void revalidate() { doLayout(); }