界面设计完成后,我要开始为那个Button的单击事件设计响应函数。
在Android中,事件的设计也很诡异。我们先来看代码:
public class HelloMyAndroid extends Activity {
/** Called when the activity is first created. */
public static int counter=0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btnClickMe=(Button)findViewById(R.id.btnClickMe);
btnClickMe.setOnClickListener(new View.OnClickListener(){
public void onClick(View view)
{
TextView lbl=(TextView)findViewById(R.id.lblHello);
Date d=new Date();
Formatter f=new Formatter();
f.format(You clicked me on %s for %d time(s)., d.toGMTString(), ++counter);
lbl.setText(f.toString());
}
});
}
}
很奇怪吧。在OnCreate事件中连接事件响应还是可以理解的,而这个Listener直接用inline class来实现至少对我来说很少见。我更习惯用一个成员函数来处理。这点还需要更进一步的研究。
其它的代码并没有什么技术含量。每次点击那个按钮后,就显示“你在什么时候点了按钮几次”而已。
两点需要说明:
- 如果我们运行程序,点击几次后用手机上的Home或者Back按钮回到主界面,然后再次运行这个程序,我们会发现,程序并没有显示原始的标签,而还是显示“你在什么时候点了按钮几次”,并且,继续点击按钮时,counter会正确的计数。这是因为,用Home或者Back回到主界面并没有关闭这个程序。这个程序还在后台运行。
f.format中用到的格式化字符串还是嵌入在程序代码中的,并没有放置到资源中然后再取出。这个问题我还没有解决。
============
第一个程序的开发先暂时如此。总结一下:
- 代码比较清晰明了。资源、代码等的分离可以免除一些不必要的麻烦;
- 速度运行的很快,至少在我的模拟器上;
- 事件响应的映射还比较自然、合理;
- 对中文的处理非常好(当然,在模拟器中还无法输入中文),中文显示没有任何问题。
下一个程序,将显示两个界面之间的转换……
Leave a Reply to tr Cancel reply