android - мульти onClick слушатель в одну кнопку - PullRequest
16 голосов
/ 28 сентября 2011

Я сделал пользовательский компонент, такой как Mybutton.java и я установил слушателя onclick в Mybutton.java.

Теперь в моем новом занятии я должен вызвать Mybutton. и добавьте контент в слушатель onclick.

Однако, если я использую OnClickListener mClickListener = new OnClickListener(){...... это заменит старый контент. Я надеюсь, что это может сделать старого и нового слушателя вместе.

Я искал некоторую информацию, узнал, что могу реализовать этот метод. После многих попыток я все еще получаю ошибки.

Может ли кто-нибудь дать мне простой пример что я могу научиться изменять его?

Ответы [ 3 ]

35 голосов
/ 28 сентября 2011

Я не думаю, что в Android API есть API, который позволяет использовать несколько onClick слушателей.Вам понадобится некоторый пользовательский класс, который обрабатывает один 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 ****
   }
});
4 голосов
/ 28 сентября 2011

Вы можете создать свой собственный класс 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.
        }
    });
0 голосов
/ 18 сентября 2018

Если вы хотите выполнить некоторую внутреннюю логику в 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);
}
...