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

时间:2016-11-07 09:24:38

标签: java

如果我在方法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");
   }
  };
}

1 个答案:

答案 0 :(得分:0)

您的问题是事情发生的顺序。会发生什么:

首先你的构造函数开始运行,基本上是进行超级调用。

然后所有字段都已初始化,因此 mCustomListener 初始化之前为mButton分配值!

解决此问题的一种方法:

private final mButton = new Button();
private final mCustomerListener = ...

然后在你的ctor中,只需做

mView.setOnClickListener(mCustomListener);

因此,换句话说:代码的问题是 mCustomListener 字段 init在之前运行mButton。

有关" order"。

的详细信息,请参阅here

(提示:我建议创建任何字段 final ,因为这是一个很好的做法。只允许稍后更改字段...当有充分理由这样做时;否则,保持你的东西最终)。