今天写的是程序的0.4版本。实现了点击屏幕的响应。当点击地洞时,会出现地鼠。
因为不能在子线程里更改View,所以就换了个思路。(参见子线程更新UI会发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方法 . )
新的逻辑思路是:点击按钮->OnClick()->setMessage()->handleMessage()。因为handler是在主线程生成的,所以不会有问题。
ActivityMain.java 主函数基本没动,就最后一步设置有变化
package com.fsy;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageButton;
/**
* 主Activity
* @author fsy
*
*/
public class ActivityMain extends Activity {
ImageButton b[];
Manage manage ;
MyClickListener listener;
MyHandler myhandler;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myhandler= new MyHandler(getMainLooper());
listener=new MyClickListener();
listener.msg=myhandler.obtainMessage();
manage = new Manage(ActivityMain.this);
b=new ImageButton[9];
b[0]=(ImageButton)findViewById(R.id.image1);
b[1]=(ImageButton)findViewById(R.id.image2);
b[2]=(ImageButton)findViewById(R.id.image3);
b[3]=(ImageButton)findViewById(R.id.image4);
b[4]=(ImageButton)findViewById(R.id.image5);
b[5]=(ImageButton)findViewById(R.id.image6);
b[6]=(ImageButton)findViewById(R.id.image7);
b[7]=(ImageButton)findViewById(R.id.image8);
b[8]=(ImageButton)findViewById(R.id.image9);
for(int i=0;i<9;i++){
b[i].setOnClickListener(listener);
}
//设置为有地鼠出来了,测试用
for(int i=0;i<9;i++){
Manage.status[i]=1;
}
}
}
Manage.java 添加了两个变量和构造函数,把类的对象存在Manage中,使其他类方便调用。
package com.fsy;
/**
* 一个管理类,将每个类的对象都传进来,类之间公用数据
* @author fsy
*
*/
public class Manage {
/**
* 记录每个鼠洞的状态,0为没出老鼠,1为出来了老鼠
*/
static int status[]= new int[9]; //记录每个鼠洞的状态,0为没出老鼠,1为出来了老鼠
static ActivityMain activitymain= new ActivityMain();
static MyHandler myhandler=new MyHandler();
Manage(ActivityMain a){
activitymain=a;
}
Manage(MyHandler myHandler) {
myhandler=myHandler;
}
}
MyClickListener.java 监听器类
package com.fsy;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
/**
*ImageButton的Listener 处理点击后的响应
* @author fsy
*
*/
public class MyClickListener implements OnClickListener{
Manage manage;
Message msg;
@Override
public void onClick(View v) {
//每一次必须新生成一个Message,因为mgs还在消息队列中
msg=Manage.activitymain.myhandler.obtainMessage();
int status=v.getId();
switch(status){
case R.id.image1 :
if(Manage.status[0] ==1){
msg.arg1=0;
Manage.myhandler.sendMessage(msg);
}
break;
case R.id.image2 :
if(Manage.status[0] ==1){
msg.arg1=1;
Manage.myhandler.sendMessage(msg);
}
break;
case R.id.image3 :
if(Manage.status[0] ==1){
msg.arg1=2;
Manage.myhandler.sendMessage(msg);
}
break;
case R.id.image4 :
if(Manage.status[0] ==1){
msg.arg1=3;
Manage.myhandler.sendMessage(msg);
}
break;
case R.id.image5 :
if(Manage.status[0] ==1){
msg.arg1=4;
Manage.myhandler.sendMessage(msg);
}
break;
case R.id.image6 :
if(Manage.status[0] ==1){
msg.arg1=5;
Manage.myhandler.sendMessage(msg);
}
break;
case R.id.image7 :
if(Manage.status[0] ==1){
msg.arg1=6;
Manage.myhandler.sendMessage(msg);
}
break;
case R.id.image8 :
if(Manage.status[0] ==1){
msg.arg1=7;
Manage.myhandler.sendMessage(msg);
}
break;
case R.id.image9 :
if(Manage.status[0] ==1){
msg.arg1=8;
Manage.myhandler.sendMessage(msg);
}
break;
}
}
}
MyHandler.java 消息接收器。
package com.fsy;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
public class MyHandler extends Handler{
Manage manage;
int index;
public MyHandler(Looper looper) {
super(looper);
manage=new Manage(this);
}
public MyHandler() {
super();
}
@Override
public void handleMessage(Message msg) {
index=msg.arg1;
Manage.activitymain.b[index].setImageResource(R.drawable.hitted);
}
}