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

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