Java Android自定义点击监听器内联vs字段删除为什么
如果我在方法declaration中设置了一个自定义的click侦听器,它就会工作。 但是,如果我将自定义单击侦听器定义为私有字段并将其设置为私有字段,它将不起作用。为什么?Java Android自定义点击监听器内联vs字段删除为什么,java,Java,如果我在方法declaration中设置了一个自定义的click侦听器,它就会工作。 但是,如果我将自定义单击侦听器定义为私有字段并将其设置为私有字段,它将不起作用。为什么? public class CustomView { private View mView; private Button mButton; public CustomView() { mButton = new Button(); mView = new View(); // thi
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");
}
};
}
你的问题是事情发生的顺序。将要发生的是: 首先,构造函数开始运行,基本上是进行超级调用 然后所有字段都被初始化,因此mCustomListener在为mButton赋值之前被初始化 解决此问题的一种方法:
private final mButton = new Button();
private final mCustomerListener = ...
然后在你的ctor中,只需执行
mView.setOnClickListener(mCustomListener);
因此,换句话说:代码的问题在于,mCustomListener的字段在您初始化mButton之前运行
有关“订单”的更多详细信息,请参阅
(提示:我建议将任何字段设置为最终字段,因为这是一种良好的做法。只有在有充分理由的情况下,才允许稍后更改字段;否则,请将您的内容设置为最终字段)。您的问题在于事情发生的顺序。将要发生的是: 首先,构造函数开始运行,基本上是进行超级调用 然后所有字段都被初始化,因此mCustomListener在为mButton赋值之前被初始化 解决此问题的一种方法:
private final mButton = new Button();
private final mCustomerListener = ...
然后在你的ctor中,只需执行
mView.setOnClickListener(mCustomListener);
因此,换句话说:代码的问题在于,mCustomListener的字段在您初始化mButton之前运行
有关“订单”的更多详细信息,请参阅
(提示:我建议将任何字段设置为最终字段,因为这是一种很好的做法。只允许以后更改字段…如果有充分的理由这样做;否则,请保留您的内容为最终字段)。我在触发onClick之前初始化字段,所以这不重要?嗯,既然您这么说。。。嗯,也许你应该在你的问题中更具体地说明“它不起作用”是如何表现出来的。我在字段中,在onClick被激发之前,所以这不重要?嗯,既然你这么说。。。好吧,也许你应该在你的问题中更具体地说明“它不起作用”是如何表现出来的。