android小项目打地鼠(二)
16lz
2021-01-26
今天写的是程序的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;@Overridepublic 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();}@Overridepublic void handleMessage(Message msg) {index=msg.arg1;Manage.activitymain.b[index].setImageResource(R.drawable.hitted);}}
更多相关文章
- Android(安卓)Studio升级提示 Connection failed. Please check
- android点击事件分发
- listview 中Item中含有Button 等造成Item点击无效的解决方法
- Android(安卓)Studio Live Templates 详解
- Eclipse中Android显示注释文档的办法和Android源码的显示办法
- eclipse中OpenCV安装指南
- android初学之Hello World
- popupwindow的一些注意事项
- Android-配置文件中设置“android:clickable="false"无效的原因