Как установить прослушиватель кликов для пользовательской кнопки?

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

У меня есть фрагмент с настраиваемой кнопкой на линейном макете XML

<LinearLayout>
 ...
<Button>
...
</Button>

<LinearLayout>

Я попытался настроить прослушиватель кликов для кнопки во фрагменте в методе onActivityCreated.

public class myFragment extend Fragment {

@Override
public void onActivityCreated (){

Button myNewButton = new myButton();
myNewButton = root.findViewByID.(R.id.button);
myNewButton.setOnClickListener(new myButton());

}

}

Мой собственный класс кнопки с методом setonclicklistener

public class myButton extend button implements View.onClicklistener {

@Override
public void setOnClickListener (OnClickListener listener){
super.setonClickListener(listener);
}

@Override
public void onClick(View view) {
//action to do after on click
}

}

2 ответа

Решение

Кажется, вы устанавливаете другую кнопку в качестве слушателя для своей исходной кнопки, в зависимости от того, какие действия вы надеетесь выполнить в слушателе, это может иметь неожиданное поведение.

Более простым решением было бы установить себя в качестве слушателя, пока вы реализовали View.onClicklistener в твоем MyButton, вы не установили его как слушателя для самого себя. Вам нужно будет сделать это в конструкторе.

Если вы хотите поддерживать набор пользователей onClickListeners вместе с MyButton слушатель, тогда вам нужно будет поддерживать переменную слушателя в вашем MyButton class, который затем можно явно вызвать.

Наконец, используйте свой MyButton в вашем макете напрямую, вместо использования Button как вы, кажется, делаете сейчас.

Ваш последний MyButton class должен быть чем-то вроде следующих строк:

public class MyButton extends androidx.appcompat.widget.AppCompatButton implements View.OnClickListener {

    public MyButton(Context context) {
        super(context);
        init();
    }

    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        setOnClickListener(this);
    }

    private View.OnClickListener mUserOnClickListener;

    @Override
    public void setOnClickListener(@Nullable OnClickListener l) {
        if (l == this) {
            super.setOnClickListener(l);
        } else {
            mUserOnClickListener = l;
        }
    }

    @Override
    public void onClick(View v) {
        //Your actions
        Toast.makeText(getContext(), "MyButton clicked", Toast.LENGTH_SHORT).show();
        if (mUserOnClickListener != null) {
            mUserOnClickListener.onClick(v);
        }
    }
}

PS - Я также предлагаю вам ознакомиться с соглашениями об именах для Java.

Попробуй это:

Удалить эту строку из myFragment:

myNewButton.setOnClickListener(new myButton());

Сделайте это в myButton:

public class myButton extend button implements View.onClicklistener {

@Override
public void setOnClickListener (OnClickListener listener){
//set like this
super.setonClickListener(this);
}

@Override
public void onClick(View view) {
//action to do after on click
}

}
Другие вопросы по тегам