Java Android自定义点击监听器内联vs字段删除为什么

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

如果我在方法declaration中设置了一个自定义的click侦听器,它就会工作。 但是,如果我将自定义单击侦听器定义为私有字段并将其设置为私有字段,它将不起作用。为什么?

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被激发之前,所以这不重要?嗯,既然你这么说。。。好吧,也许你应该在你的问题中更具体地说明“它不起作用”是如何表现出来的。