2011-03-03 27 views
2

我有一個活動MyActivity,並帶有一個按鈕MyButton從外部類文件中定義的偵聽器開始Android活動

我想附加MySpecialOnClickListenerMyButton

我在外部類文件中寫入MySpecialOnClickListener

public class MySpecialOnClickListener extends ButtonHandler implements OnClickListener { 
    public OnClickListenerWithSpeech (Context context) 
     { super.context = context; } 

    @Override 
    public void onClick(View view) { handleClick(view); } 
} 

和ButtonHandler看起來像這樣

public abstract class ButtonHandler { 

    protected Context context; 

    protected void handleClick (View view){ 
     if (view.getid()==R.id.button_B) { 
      context.startActivity (new Intent(context, ActivityC.class)); 
     } 
    } 
} 

我基本上要保存所有的邏輯在ButtonHandler按鈕。

SO ......正如我所說的,我在外部類文件中定義了MySpecialOnClickListener

當我點擊MyButton時,出現以下致命錯誤。

Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want? 

因此,我無法從非活動內正常開始活動。很公平。

但是,如果我將MySpecialOnClickListener更改爲'MyActivity'中的內部類,它可以正常工作。記住'ButtonHandler'仍然是一個外部類文件。所以它(ActivityC最終從哪裏開始)不會改變。

我的問題(最後)是:有人可以解釋爲什麼允許一個而另一個不允許的邏輯。我認爲它是一個範圍廣泛的東西或某事,但我有點困惑。看起來代碼開始活動的過程必須字面上在另一個活動。

編輯 - 問題解決了

見下文。班級的位置是不相關的。我只是沒有正確傳遞。

回答

1

因爲ButtonHandler的「上下文」字段不與任何活動上下文關聯。所以,當你將MySpecialOnClickListener實例附加到一個按鈕時,你創建它傳遞上下文參數,不是嗎?

是這樣的:

MySpecialOnClickListener listener = new MySpecialOnClickListener(MyActivity.this); 
aButton.setOnClickListener(listener); 
這樣you're構建按鈕,用正確的上下文

...

+0

感謝您的幫助佛朗哥。通過搞亂我剛纔知道了,但你已經發現了。 – Tim 2011-03-03 20:11:46

0

很可能您沒有將活動上下文傳遞給MySpecialOnClickListener。你能告訴我在調用內部類方法方面的差異嗎?

+0

謝謝你的幫助馬修。我知道我做錯了什麼。但我最初並沒有給你提供足夠的信息,但你肯定提出了正確的問題! – Tim 2011-03-03 20:57:57

0

對不住那些你們誰試圖回答。這是我的錯(我不包括最初下列信息的人)

當我路過的背景下,以「MySpecialOnClickListener」我會做:

view.setOnClickListener(new MySpecialOnClickListener(getApplicationContext())); 

時,我應該做的:

view.setOnClickListener(new MySpecialOnClickListener(this)); 

因此getApplicationContext()似乎沒有得到應用程序的「正確」上下文。

這使我對我的下一個問題,什麼getApplicationContext()實際上返回:)

相關問題