Как установить прослушиватель кликов для пользовательской кнопки?
Я попытался настроить свой слушатель для своего пользовательского класса кнопок. Однако похоже, что мой слушатель не сопоставляется с представлением. Есть идеи объединить мой вид кнопки и мою настраиваемую кнопку?
У меня есть фрагмент с настраиваемой кнопкой на линейном макете 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
}
}