MainAcitvity.this和this的区别

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章