如果我在方法decleration中设置自定义单击侦听器,则它可以正常工作。 但是,如果我将自定义单击侦听器定义为私有字段并进行设置,则它不起作用。为什么呢?
public class CustomView {
private View mView;
private Button mButton;
public CustomView() {
mButton = new Button();
mView = new View();
// this works
mView.setOnClickListener(new CustomClickListener() {
@Override
public void onClick() {
mButton.setText("xyz");
}
});
// this doesn't work as in nothing happens.
mView.setOnClickListener(mCustomListener);
}
private CustomClickListener mCustomListener = new CustomClickListener() {
@Override
public void onClick() {
mButton.setText("xyz");
}
};
}
答案 0 :(得分:0)
您的问题是事情发生的顺序。会发生什么:
首先你的构造函数开始运行,基本上是进行超级调用。
然后所有字段都已初始化,因此 mCustomListener 初始化之前为mButton分配值!
解决此问题的一种方法:
private final mButton = new Button();
private final mCustomerListener = ...
然后在你的ctor中,只需做
mView.setOnClickListener(mCustomListener);
因此,换句话说:代码的问题是 mCustomListener 的字段 init在之前运行mButton。
有关" order"。
的详细信息,请参阅here(提示:我建议创建任何字段 final ,因为这是一个很好的做法。只允许稍后更改字段...当有充分理由这样做时;否则,保持你的东西最终)。