android的事件处理1(监听 回调 handle)
来源:互联网 发布:网络流行年轻群体文化 编辑:程序博客网 时间:2024/06/03 21:16
1.监听
事件源:任何组件,buttun等.
事件监听器:myclicklistener
注册监听器:setxxxlistener
1)内部类作为事件监听器类:
可以访问外部类所有的界面组件.
2)外部类作为事件监听器类:
不能自由的访问界面的组件;
如果某个监听器确实需要被多个界面共享,而且主要是完成某种业务逻辑.
界面:
public class SendSms extends Activity{EditText address;EditText content;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);address = (EditText)findViewById(R.id.address);content = (EditText)findViewById(R.id.content);Button bn = (Button)findViewById(R.id.send);bn.setOnLongClickListener(new SendSmsListener(this , address, content));}}
外部类:
public class SendSmsListener implements OnLongClickListener{private Activity act;private EditText address;private EditText content;public SendSmsListener(Activity act, EditText address, EditText content){this.act = act;this.address = address;this.content = content;}@Overridepublic boolean onLongClick(View source){String addressStr = address.getText().toString();String contentStr = content.getText().toString();SmsManager smsManager = SmsManager.getDefault();PendingIntent sentIntent = PendingIntent.getBroadcast(act, 0, new Intent(), 0);smsManager.sendTextMessage(addressStr, null, contentStr, sentIntent, null);return false;}}
3)activity本身作为监听器,很混乱,不推荐
4)匿名内部类,大家都用的那种,不赘诉.
5)直接绑定到xml.android:onclick="";
2.回调
- Class A实现接口CallBack callback——背景1
- class A中包含一个class B的引用b ——背景2
- class B有一个参数为callback的方法f(CallBack callback) ——背景3
- A的对象a调用B的方法 f(CallBack callback) ——A类调用B类的某个方法 C
- 然后b就可以在f(CallBack callback)方法中调用A的方法 ——B类调用A类的某个方法D
下面代码摘自http://blog.csdn.net/xiaanming/article/details/8703708
- //这个是View的一个回调接口
- /**
- * Interface definition for a callback to be invoked when a view is clicked.
- */
- public interface OnClickListener {
- /**
- * Called when a view has been clicked.
- *
- * @param v The view that was clicked.
- */
- void onClick(View v);
- }
- package com.example.demoactivity;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.Toast;
- /**
- * 这个就相当于Class A
- * @author xiaanming
- * 实现了 OnClickListener接口---->背景一
- */
- public class MainActivity extends Activity implements OnClickListener{
- /**
- * Class A 包含Class B的引用----->背景二
- */
- private Button button;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- button = (Button)findViewById(R.id.button1);
- /**
- * Class A 调用View的方法,而Button extends View----->A类调用B类的某个方法 C
- */
- button.setOnClickListener(this);
- }
- /**
- * 用户点击Button时调用的回调函数,你可以做你要做的事
- * 这里我做的是用Toast提示OnClick
- */
- @Override
- public void onClick(View v) {
- Toast.makeText(getApplication(), "OnClick", Toast.LENGTH_LONG).show();
- }
- }
下面是View类的setOnClickListener方法,就相当于B类咯,只把关键代码贴出来
- /**
- * 这个View就相当于B类
- * @author xiaanming
- *
- */
- public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource {
- /**
- * Listener used to dispatch click events.
- * This field should be made private, so it is hidden from the SDK.
- * {@hide}
- */
- protected OnClickListener mOnClickListener;
- /**
- * setOnClickListener()的参数是OnClickListener接口------>背景三
- * Register a callback to be invoked when this view is clicked. If this view is not
- * clickable, it becomes clickable.
- *
- * @param l The callback that will run
- *
- * @see #setClickable(boolean)
- */
- public void setOnClickListener(OnClickListener l) {
- if (!isClickable()) {
- setClickable(true);
- }
- mOnClickListener = l;
- }
- /**
- * Call this view's OnClickListener, if it is defined.
- *
- * @return True there was an assigned OnClickListener that was called, false
- * otherwise is returned.
- */
- public boolean performClick() {
- sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);
- if (mOnClickListener != null) {
- playSoundEffect(SoundEffectConstants.CLICK);
- //这个不就是相当于B类调用A类的某个方法D,这个D就是所谓的回调方法咯
- mOnClickListener.onClick(this);
- return true;
- }
- return false;
- }
- }
3.handle
出现的原因:android平台只允许主线程修改Activity的UI组件,这样就导致新启动的线程无法改变界面组件的属性值,如果要修改,就得用handle的消息传递机制.
Handle类的作用:
在新启动的线程中发送消息.
在主线程中获取,处理消息.
相当于在子线程里发个消息,主线程里接受到这个消息,然后修改组件,子线程只是发消息,修改还是在主线程
public class HandlerPostActivity1 extends Activity { private Button btnMes1,btnMes2; private TextView tvMessage; // 声明一个Handler对象 private static Handler handler=new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.message_activity); btnMes1=(Button)findViewById(R.id.btnMes1); btnMes2=(Button)findViewById(R.id.btnMes2); tvMessage=(TextView)findViewById(R.id.tvMessage); btnMes1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 新启动一个子线程 new Thread(new Runnable() { @Override public void run() { // tvMessage.setText("..."); // 以上操作会报错,无法再子线程中访问UI组件,UI组件的属性必须在UI线程中访问 // 使用post方式修改UI组件tvMessage的Text属性 handler.post(new Runnable() { @Override public void run() { tvMessage.setText("使用Handler.post在工作线程中发送一段执行到消息队列中,在主线程中执行。"); } }); } }).start(); } }); btnMes2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { // 使用postDelayed方式修改UI组件tvMessage的Text属性值 // 并且延迟3S执行 handler.postDelayed(new Runnable() { @Override public void run() { tvMessage.setText("使用Handler.postDelayed在工作线程中发送一段执行到消息队列中,在主线程中延迟3S执行。"); } }, 3000); } }).start(); } }); }}
例子2:定时换图片
public class HandlerTest extends Activity{int[] imageIds = new int[]{R.drawable.java,R.drawable.ee,R.drawable.ajax,R.drawable.xml,R.drawable.classic};int currentImageId = 0;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);final ImageView show = (ImageView) findViewById(R.id.show);final Handler myHandler = new Handler(){@Overridepublic void handleMessage(Message msg){if (msg.what == 0x1233){show.setImageResource(imageIds[currentImageId++% imageIds.length]);}}};new Timer().schedule(new TimerTask(){@Overridepublic void run(){myHandler.sendEmptyMessage(0x1233);}}, 0, 1200);}}
0 0
- android的事件处理1(监听 回调 handle)
- android 监听事件的处理
- Android 事件监听处理
- Android 事件监听处理
- 【Android的事件处理】-----基于监听的事件处理
- Android的事件处理之基于监听的事件处理
- Android的事件处理之基于监听的事件处理
- Android基于监听的事件处理
- Android基于监听的事件处理机制
- Android基于监听的事件处理
- Android include标签的监听事件处理
- android基于监听的事件处理机制
- android事件处理机制-基于监听的事件处理
- Android事件处理之一 基于监听的事件处理
- Android中的事件处理总结-基于监听的事件处理
- Android事件处理之基于监听的事件处理
- Android事件处理之基于监听的事件处理
- Android中的事件处理总结-基于监听的事件处理
- 第三次作业——顺序查找,二分查找
- Find them, Catch them 并查集
- 窗口对象的方法 prompt() 用来输入数据
- java内存管理之二
- 2014开源技术大会(读书汇)
- android的事件处理1(监听 回调 handle)
- 插入排序算法
- javascript弹出框打印某个数值时,弹出NaN?(not a number)
- 论坛营销四要素
- 【DFS&二叉树】Binary Tree Maximum Path Sum
- jvm的参数含义及设置
- fcntl函数说明
- c++ primer阅读笔记-12章-2
- Java内存溢出的详细解决方案