android-一键多 onClick 监听器

发布于 2024-12-07 08:03:58 字数 317 浏览 0 评论 0原文

我制作了一个自定义组件,例如 Mybutton.java 我在 Mybutton.java 中设置了一个 onclick 监听器。

现在,在我的新活动中,我必须调用 Mybutton 并在 onclick 监听器中添加内容。

但是,如果我使用 OnClickListener mClickListener = new OnClickListener(){...... 它将替换旧内容。 希望新老听众能够共同做到。

我查了一些资料,发现可以实现这个方法。 经过多次尝试,我仍然遇到错误。

谁能给我一个简单的例子 我可以学习修改它吗?

I have made a custom component like Mybutton.java
and I have set an onclick listener in Mybutton.java.

Now, in my new activity, I have to call a Mybutton
and add content in onclick listener.

However, if I use OnClickListener mClickListener = new OnClickListener(){......
it will replace the old content.
I hope it can do the old and new listener together.

I have searched for some information, found out i can implement this method.
After many attempts, I'm still getting errors.

Can anyone give me a simple example
that i can learn to modify it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

吃→可爱长大的 2024-12-14 08:03:58

我认为 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 ****
   }
});

I don't think there's an API in the Android API that allows multiple onClick listeners. You'd need some custom class that handles a single onClick() and pass in handlers for it to call. Something like this:

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

When your setting your buttons, do:

CompositeOnClickListener groupListener = new CompositeOnClickListener();
myButton.setOnClickListener(groupListener);

Then, whenever you want to add another listener, just call

groupListener.addOnClickListener(new View.OnClickListener(){
   @Override
   public void onClick(View v){
      **** Custom implementation ****
   }
});
゛清羽墨安 2024-12-14 08:03:58

您可以创建如下所示的自定义 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.
        }
    });

You could create your custom Button class something like this :

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

    }

and, use it like this :

    // 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.
        }
    });
冷了相思 2024-12-14 08:03:58

如果您想在自定义视图的 onClick 中执行一些内部逻辑,并希望执行外部设置的 OnClickListener 的逻辑,我认为一个简单的方法是重写 setOnClickListener ,如下所示。

在 Kotlin 中:

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

If you want to execute some internal logic in your custom view's onClick and want to execute the externally set up OnClickListener's logic, I think a simple way is overriding setOnClickListener as below.

In Kotlin:

override fun setOnClickListener(externalOnClickListener: View.OnClickListener?) {
    val internalOnClickListener = View.OnClickListener { view -> 
        //Your awesome internal logic
        externalOnClickListener?.onClick(view)
    }
    super.setOnClickListener(internalOnClickListener)
}

Same in 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);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文