android — прослушиватель нескольких нажатий одной кнопкой

#android #onclick #listener

#Android #onclick #прослушиватель

Вопрос:

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

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

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

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

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

Комментарии:

1. Я не уверен, почему вы хотите иметь несколько прослушивателей, можете ли вы подсказать мне вариант использования?

2. Что именно MyButton.java ? Это файл, содержащий класс, который расширяет класс кнопок Android?

Ответ №1:

Я не думаю, что в 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 ****
   }
});
  

Комментарии:

1. Я пытался создать свой пользовательский класс, который расширяет Button и реализует View. OnClickListener, но, к сожалению, метод реализации onClick() не был запущен :/

2. Если вы реализуете новый класс, вам нужно добавить его в объект просмотра через setOnClickListener . Если вы переопределяете представление напрямую, вы можете переопределить onClick() его напрямую для его обработки.

3. Мне нужно было что-то в этом роде для OnTouchListener, это сэкономило мне некоторое время! Спасибо @DeeV

Ответ №2:

Вы могли бы создать свой пользовательский 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.
        }
    });
  

Ответ №3:

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