曾经项目中用到的回调:
这是一个类中的方法:只需要传入一个AppMonitorListener接口的实现类对象即可;
另一个A类(调回调),
另一个B类(调回调),
重点看下图片中写的注释!!
规定客户端拿到服务端发出的数据后做的方法,具体实现还要靠客户端去实现;
服务端类(把值传出去的那个类,最终客户端调):
被监听的一个类(客户端类): 实现监听器的注册(也就是调用服务类的实例的setListener方法,并在其中重写公共接口中的
回调方法),满足服务端的条件(实现按下逻辑啥的等等)
举个自己的例子:
一个自定义圆形进度条view接收来自另一个开了子线程来不断更新
进度值的类,最后发现onDraw中的回调方法没用,可能是因为onDraw
一直在调用啥的,最后在自定义view中写了set方法来设置进度。回调
可能不能用在onDraw方法中吧
遇到一个实例:
在一个listview中长按某一个item,会出现一个dialog,只包含一个按钮,点击按钮会将这个item的位置传出;
我这里想采用回调来进行传值:
这里有两种解决方法:
public class MyDialog extends Dialog implements android.view.View.OnClickListener {
private Context context;
private TextView txt;
private Button btnok,btnedit,btncancle,btnsave;
private LeaveMyDialogListener listener;
public interface LeaveMyDialogListener{
public void onClick(View view);
}
public MyDialog(Context context) {
super(context);
// TODO Auto-generated constructor stub
this.context = context;
}
public MyDialog(Context context,int theme,LeaveMyDialogListener listener) {
super(context,theme);
// TODO Auto-generated constructor stub
this.context = context;
this.listener = listener;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
this.setContentView(com.Ieasy.ieasyware.R.layout.mydialog);
//创建控件实例
btncancle = (Button)findViewById(R.id.mycancle);
btnedit = (Button)findViewById(R.id.myedit);
btnok = (Button)findViewById(R.id.myok);
txt = (TextView)findViewById(R.id.miaosu);
btnsave = (Button)findViewById(R.id.mysave);
btncancle.setOnClickListener(this);
btnedit.setOnClickListener(this);
btnok.setOnClickListener(this);
btnsave.setOnClickListener(this);
}
//这样的话,每次dialog中的按钮点击一下,都会去调用一次回调!
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
listener.onClick(v);
}
}
public class ButtonM extends Button {
/**
* 标示onTouch方法的返回值,用来解决onClick和onTouch冲突问题
*/
private boolean isCost = true;
public ButtonM(Context context) {
super(context, null);
}
public ButtonM(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ButtonM(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
/**
* @return isCost
* 为解决onTouch和onClick冲突的问题
* 根据事件分发机制,如果onTouch返回true,则不响应onClick事件
* 因此采用isCost标识位,当用户设置了onClickListener则onTouch返回false
//因为用户的点击事件在view中传递的顺序是:onTouchListener>onTouchEvent>onClickListener
*/
@Override public boolean onTouchEvent(MotionEvent event) { //在 switch case语句中进行用户动作的判断,如果用户抬起的话 }
/**
* 重写setOnClickListener方法,解决onTouch和onClick冲突问题
* @param l
*/
@Override
public void setOnClickListener(OnClickListener l) {
super.setOnClickListener(l);
isCost = false;
}
}