2011-08-27 34 views
3

我有一個自定義視圖MyViewmy_view.xml(與相應的Java類MyView.java)膨脹。Android和使這個按鈕之一的這個監聽器

我覆蓋MyView(Context context, AttributeSet attrs)將子視圖連接到類的成員。

現在其中一個子視圖是Button,我希望我的視圖可以在將此事件傳遞給委託之前監聽其按鈕的點擊。但是如果我在構造函數中MyView(Context context, AttributeSet attrs)(其中thisMyView一個實例),我收到了NullPointerException聲明

this.myButton.setOnClickListener(this);

MyClass.java哪裏可以撥打this.myButton.setOnClickListener(this);

%%

編輯。有些代碼:

public MyView(Context ctx, AttributeSet attrs) 
{ 
    super(context, attrs); 
    this.myButton = (Button) this.findViewById(R.id.my_button); 
    this.myButton.setOnClickListener(this); // Raises null pointer;'id' is correct. 
} 
+0

基本上,只有在myButton被初始化之後纔會被調用。 – aroth

+0

你能詳細說明一下嗎?這並沒有太大的幫助。例如,一旦'super(ctx,attr)'被調用了''myButton'沒有被初始化?在調用'MyView'的'super'之後,我調用'this.myButton.setOnClickListener(this);'。 – SK9

+1

我不知道Android如何加載視圖的確切細節,但我認爲這是合理的,假設它沒有多線程的過程。如果是這種情況,那麼在你的構造函數返回之前,'myButton'不能爲非null,除非你自己在你的構造函數中手動設置按鈕。對super()的調用在很大程度上是不相關的,因爲超類可能不知道或關心'myButton'。 – aroth

回答

2

,而不是試圖做在構造函數中調用setOnClickListener(this),做到這一點後,按鈕被完全初始化。嘗試從父活動的onResume方法移動setOnClickListener(this)因此它被稱爲(間接)是這樣的:

public class MainMenuActivity extends Activity { 
    @Override 
    public void onResume() { 
     super.onResume(); 
     new MyView(this, attrs).onResume(); 
    } 
    ... 
} 

public class MyView { 
    public void onResume() { 
     myButton.setOnClickListener(this); 
    } 
    ... 
} 

我用Roboguice所有的時間這樣的事情,並強烈推薦它。我的按鈕處理程序代碼如下所示:

class ButtonHandler implements OnClickListener { 
    @InjectView(R.id.MainMenuButton) 
    private Button button; 

    public void onResumeEvent(@Observes OnResumeEvent onResume) { 
     button.setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 
     doSomethingUseful(); 
    } 
} 
+0

謝謝。正確的假設。現在顯示一些代碼。只有在MyView的構造函數放棄了控制之後,我才說「按鈕已完全初始化」? – SK9

+0

@ SK9,不一定。查看我的編輯以獲得進一步的說明。 –

0

問題是我已經錯過了關中構造一個充氣:

LayoutInflater i = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
i.inflate(R.layout.my_view, this); 

這是混淆了我,我還以爲構造MyView(Context ctx, AttributeSet attrs)會被稱爲誇大的觀點,而不是相反。

相關問題