2011-06-21 25 views
1

我在嘗試重新分配OnClickListener時遇到問題。在下面的代碼中,我的程序運行startWorkout()方法,每次單擊按鈕時,它會計算這是否是最後一次運行。如果它是最後一次運行,它會調用lastSet()方法。 lastSet()方法應該重新設置按鈕,以便它執行不同的操作,但每次單擊它時,都會執行startWorkout()方法中聲明的內容。OnClickListener重新分配問題 - Android

當我通過調試模式運行它時,程序正確地通過lastSet()方法並分配給偵聽器。但是之後它又回到了startWorkout()方法並重新分配了偵聽器!所以當用戶點擊它時,該按鈕回到原來的監聽器而不是最終的監聽器。

有誰知道爲什麼會發生這種情況?

public void startWorkout() { 
    doSet(); 
    Button doneButton = (Button)findViewById(R.id.done); 
    doneButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      // If this is the last result, calls last(set) instead 
      saveResult(); 
      takeRest(61000, 30000); 
     } 
    }); 

} 

public void lastSet() { 
    // Changes layout (keeps the same button) 
    setLayoutTest(); 
    Button doneButton = (Button)findViewById(R.id.done); 
    doneButton.setOnClickListener(new View.OnClickListener() { 


     @Override 
     public void onClick(View v) { 
      // Call Finish Methods 

     } 
    }); 
} 
+0

我沒有看到startWorkout()在任何地方調用lastSet()。另外,請提供saveResult()和setLayoutTest()的詳細信息。 – f20k

+0

是的,我把這些東西剪掉以使它更簡單。我想我發現了這個問題。 – easycheese

回答

1

解決它......我其實是分配聽衆兩次......(解決很久以前,只是清理我的計算器問題)

如果你這樣做:

doneButton.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 

     // If this is the last result, calls last(set) instead 
     saveResult(); 
     takeRest(61000, 30000); 
    } 
}); 

然後將此:

doneButton.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 

     runMethod2(); 
    } 
}); 
(在這種情況下runMethod2())

然後只有第二個將運行。菜鳥的錯誤,只要確保刪除(或覆蓋)任何遺留代碼。

+0

也許你應該解釋它出錯的地方?哦,只是一個音符,但按照慣例,MethodNames應該是PascalCase。 – lesderid

+0

我沒有解釋過......我將偵聽器分配了兩次,我不確定還有什麼其他解釋是必要的......另外,我不確定您在我的方法名稱中指的是什麼,我遵循Android約定來源:http://source.android.com/source/code-style.html – easycheese

+0

糟糕,對不起,我還在想C#(關於命名),你顯然是對的。 – lesderid