2016-11-07 32 views
1

如果我在方法decleration中設置了自定義單擊監聽器,它將起作用。 但是,如果我將自定義點擊偵聽器定義爲專用字段並進行設置,則不起作用。爲什麼?Android自定義單擊監聽器內聯vs外框刪除爲什麼

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

你的問題是事情發生的順序。會發生什麼是:

首先你的構造函數開始運行,基本上是一個超級調用。

然後所有的字段都被初始化,所以mCustomListener是init'ed 以前您分配一個值mButton!解決這個問題

方式一:

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

,然後你的構造函數中,只是做

mView.setOnClickListener(mCustomListener); 

所以,換句話說:你的代碼的問題是, init爲mCustomListener運行之前你初始化mButton。

請參閱here關於「訂單」的更多詳細信息。 (提示:我建議任何字段最終,只是因爲這是一個很好的做法,只允許稍後改變字段...當有充分的理由時;否則,保持你的東西最後)。

+0

我在onClick被觸發之前初始化了這個字段,所以沒關係? – user3995789

+0

嗯,現在你說...那麼,也許你應該在你的問題中更具體一些,說明「它不工作」如何體現自己。 – GhostCat