1. 程式人生 > >匿名內部類中this的使用問題

匿名內部類中this的使用問題

大多數情況下,我在對Android的事件處理方式都是用的基於監聽的事件處理方式。在這當中,一般都會涉及到事件監聽器這樣一個類。大部分的時候,事件監聽器都沒有什麼複用價值,因此大部分的事件監聽器只是臨時使用一次,所以使用匿名內部類形式的事件監聽器更合適。實際上,這種形式也是目前使用最廣泛的事件監聽器形式。一般用於建立匿名內部類形式的事件監聽器都是像這樣的:“new 監聽器介面”或“new 事件介面卡”。
而對於使用匿名內部類作為事件監聽器類的形式來說,唯一的缺點就是匿名內部類的語法有點不易掌握,例如今天要說的this的使用就是其中之一。
首先請看一段程式碼:

public class MainActivity
extends Activity {
Button bn; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); bn = (Button) findViewById(R.id.bn); // 使用匿名內部類的例項作為事件監聽器 bn.setOnClickListener(new OnClickListener() { // 實現事件處理方法:當點選按鈕時,跳轉到下一個介面
@Override public void onClick(View v) { //準備intent物件 Intent intent = new Intent(this,NextActivity.class); //啟動下一個介面 startActivity(intent ); } }); } }

上面那段程式碼是段錯誤的程式碼。報錯的地方就是Intent intent = new Intent(this,NextActivity.class);這個地方。為什麼了?因為在匿名內部類中,如果外部類(MainActivity)沒有實現對應的事件監聽器介面(比如這裡的OnClickListener),是不能隨便使用this的。因為我們是直接new的匿名內部類,這樣就會把這個this當做是OnClickListener。所以才會報錯。
這種情況的解決辦法就是用MainActivity.this代替this


注:如果外部類(MainActivity)實現對應的事件監聽器介面(比如這裡的OnClickListener):public class MainActivity extends Activity implements OnClickListener{ ……….. }。那麼這就是屬於使用Activity本身作為事件監聽器類的範疇,這我已在別的部落格文章裡做了專門的介紹,可移步前看。