回调传值 自定义Dialog中控件回调 自定义控件回调

曾经项目中用到的回调:

这是一个类中的方法:只需要传入一个AppMonitorListener接口的实现类对象即可;

 

另一个A类(调回调),

 

另一个B类(调回调),

 

 

 

 

 

重点看下图片中写的注释!!

 

规定客户端拿到服务端发出的数据后做的方法,具体实现还要靠客户端去实现;

 


服务端类(把值传出去的那个类,最终客户端调):



被监听的一个类(客户端类): 实现监听器的注册(也就是调用服务类的实例的setListener方法,并在其中重写公共接口中的
回调方法),满足服务端的条件(实现按下逻辑啥的等等)

 

举个自己的例子:
一个自定义圆形进度条view接收来自另一个开了子线程来不断更新
进度值的类,最后发现onDraw中的回调方法没用,可能是因为onDraw
一直在调用啥的,最后在自定义view中写了set方法来设置进度。回调
可能不能用在onDraw方法中吧

 

 

 

遇到一个实例:

在一个listview中长按某一个item,会出现一个dialog,只包含一个按钮,点击按钮会将这个item的位置传出;

我这里想采用回调来进行传值:

这里有两种解决方法:

1.自定义Dialog,并且在这个dialog中声明回调接口,并创建这个按钮的实例来重写这个按钮的点击方法;


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);
    }
}

 

2.在自定义控件中声明接口(个人认为第一种最好,这一种最好不要用):

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;
    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值