今天写的是程序的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); } }