在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指定。