一个点击事件失效的记录
下面是一个作为父类的dialog
js
public abstract class BaseDialog <VDB extends ViewDataBinding> extends AppCompatDialog {
protected VDB binding;
public BaseDialog(@NonNull Context context) {
super(context);
binding = DataBindingUtil.inflate(
getLayoutInflater(),
getContentViewId(),
null,
false
);
setContentView(getContentViewId());
processLogic();
}
protected abstract int getContentViewId();
/**
*处理业务逻辑
* */
protected abstract void processLogic();
}
这是他的一个子类
js
public class GainDialog extends BaseDialog<DialogGainBinding> {
public GainDialog(@NonNull Context context) {
super(context);
Log.d("dialog","22222");
}
@Override
protected int getContentViewId() {
return R.layout.dialog_gain;
}
@Override
protected void processLogic() {
binding.closeButton.setOnClickListener(v -> {
dismiss();
});
}
}
可以看到在这个子类中,我们已经对closeButton设置了点击事件让其关闭,但是当我们运行之后,点击这个按钮发现并没有像我们预期之中一样关闭弹窗。 经过排查发现问题出现在父类的这一行代码
setContentView(getContentViewId());
如果把这行代码换成
setContentView(binding.getRoot());
点击事件就能成功响应了。
为什么会这样还没有仔细分析。除此之外,还有一个疑惑的的地方:就是当我们实例化GainDialog时用的是
GainDialog dialog = new GainDialog(MainActivity.this);
为什么还调用了父类里的构造方法
js
public BaseDialog(@NonNull Context context) {
super(context);
binding = DataBindingUtil.inflate(
getLayoutInflater(),
getContentViewId(),
null,
false
);
setContentView(getContentViewId());
processLogic();
}