在Miwok應用開發過程中,在MainActivity類中用到了MainActivity.this,這裏說明爲什麼不可用this。
1.先說明Context和Activity的關係
在谷歌搜索Android:Context進入開發者官網可以看到,Activity是Context的一個間接子類,Activity從語法上可以說是一個Context。
2.什麼情況下使用“類名.this”這種語法?
在內部類需要使用外部類的成員變量或者方法的時候。
ps:如果內部類和外部類有變量或者方法重名的時候,則必須使用className.this.xxx來指定那個類的成員變量或者方法。如果沒有重名則該變量可以指定所屬類也可以不指定所屬類。
For example:
public class Test{
int number = 20;
public void show(){
Hero hero = new Hero();
hero.kill();
}
//內部類
class Hero{
int number = 30;
void kill(){
System.out.println("This hero's killed: " + this.number);
//內部類需要用到外部類的成員或者方法。
System.out.println("This hero's killed: " + Test.this.number);
}
}
3.再看Miwok應用中的MainActivity代碼
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView numbers = (TextView) findViewById(R.id.numbers);
//new View.OnclickListener()創建匿名類
numbers.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
Toast.makeText(MainActivity.this, "Opening Numbers Lists", Toast.LENGTH_SHORT).show();
//由於上面創建了一個匿名類,匿名類是內部類,
//所以第一個參數Context必須是 MainActivity.this而不是this,
//如果使用this,則指得是這個匿名類,但是它並不是Context的子類,
//因此Intent的第一個參數必須是該類的外部類,需要明確指出
Intent intent = new Intent(MainActivity.this, NumbersActivity.class);
startActivity(intent);
}
});
TextView colors = (TextView) findViewById(R.id.colors);
colors.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
//view.getContext()會返回該視圖所在的Context
Toast.makeText(view.getContext(),"Open Color lists", Toast.LENGTH_LONG).show();
Intent intent = new Intent(MainActivity.this, ColorsActivity.class);
startActivity(intent);
}
});
}
}
創建顯示Intent實例時,傳入的第一個參數是要求是Context,一般用當前的Activity。
由於每一個類都有一個成員變量this,有重名衝突,在創建的內部匿名類中使用this的話, 指向的是當前的內部匿名類, 該類並不是Context的子類, 因此會報錯。因此必須顯示指定外部類MainActivity的那個this, 用MainActivity.this指定。