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