匿名內部類中this的使用問題
阿新 • • 發佈:2019-01-26
大多數情況下,我在對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本身作為事件監聽器類的範疇,這我已在別的部落格文章裡做了專門的介紹,可移步前看。