我制作了一个像Mybutton.java这样的自定义组件 我在Mybutton.java中设置了一个onclick监听器。
现在,在我的新活动中,我必须打电话给Mybutton 并在onclick监听器中添加内容。
但是,如果我使用OnClickListener mClickListener = new OnClickListener(){......
它将取代旧内容。
我希望它可以一起做新旧听众。
我搜索了一些信息,发现我可以实现这个方法。 经过多次尝试,我仍然遇到错误。
任何人都可以给我一个简单的例子 我可以学习修改它吗?
答案 0 :(得分:35)
我认为Android API中没有允许多个onClick
侦听器的API。您需要一些自定义类来处理单个onClick()
并传入处理程序以供其调用。像这样:
private class CompositeOnClickListener implements View.OnClickListener{
List<View.OnClickListener> listeners;
public CompositeOnClickListener(){
listeners = new ArrayList<View.OnClickListener>();
}
public void addOnClickListener(View.OnClickListener listener){
listeners.add(listener);
}
@Override
public void onClick(View v){
for(View.OnClickListener listener : listeners){
listener.onClick(v);
}
}
}
设置按钮时,请执行以下操作:
CompositeOnClickListener groupListener = new CompositeOnClickListener();
myButton.setOnClickListener(groupListener);
然后,只要您想添加另一个侦听器,只需调用
即可groupListener.addOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
**** Custom implementation ****
}
});
答案 1 :(得分:4)
您可以创建自定义Button
类,如下所示:
public class MyButton extends Button {
private CustomOnClickListener mCustomOnClickListener;
public interface CustomOnClickListener {
void onClick(View v);
}
public MyButton(Context context) {
super(context);
// Set your own onClickListener
View.OnClickListener ocl = new View.OnClickListener() {
@Override
public void onClick(View v) {
// Do whatever you want to do
// Invoke the other added onclick listener
if(mCustomOnClickListener != null) {
mCustomOnClickListener.onClick(v);
}
}
};
setOnClickListener(ocl);
}
// use this function to set the other onclick listener
public void setCustomOnClickListener(CustomOnClickListener cl) {
mCustomOnClickListener = cl;
}
}
并且,像这样使用它:
// create your button
MyButton button = new MyButton(context);
// add your custom onClickListener
button.setCustomOnClickListener(new MyButton.CustomOnClickListener() {
@Override
public void onClick(View v) {
// Do whatever you intend to do after the actual onClickListener
// from MyButton class has been invoked.
}
});
答案 2 :(得分:0)
如果您想在自定义视图的onClick中执行一些内部逻辑,并希望执行外部设置的OnClickListener的逻辑,那么我认为一种简单的方法是覆盖setOnClickListener,如下所示。
在科特林:
override fun setOnClickListener(externalOnClickListener: View.OnClickListener?) {
val internalOnClickListener = View.OnClickListener { view ->
//Your awesome internal logic
externalOnClickListener?.onClick(view)
}
super.setOnClickListener(internalOnClickListener)
}
与Java相同:
@Override
public void setOnClickListener(@Nullable final View.OnClickListener externalOnClickListener) {
View.OnClickListener internalOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View view) {
//Your awesome internal logic
if (externalOnClickListener != null) {
externalOnClickListener.onClick(view);
}
}
};
super.setOnClickListener(internalOnClickListener);
}