2016-09-26 13 views
4

私はActivityを終了するために1つのボタンでActivityを持っています。finish()はOnClickイベントでどのように機能しますか?

layout.xmlを通じて

私はcmd_exitOnClickイベントを設定する必要がとの呼び出し '(this.finish)' 細かい

public void cmd_exit(View editLayout){ 
    this.finish(); 
} 

を動作しますが、私が代わりにOnClickListener

cmd_exit = (Button) this.findViewById(R.id.cmd_ExitApp); 
cmd_exit.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View view) { 
    finish(); 
    } 
}); 
を追加するとき

this.finish()にエラーがあります。それはfinish()でなければなりません。

私はfinish()Activityクラスに住んでいることを理解していますので、私の質問はどのように2番目のスニペットで機能していますか?最初のケースではthis

答えて

3

OnClickListenerを匿名クラスとして作成した場合、thisキーワードは、その囲むクラスではなくそのリスナーインスタンスを参照します。代わりにYourActivityClassName.thisを使用できます。また、単にthisを省略することができ、かつActivity 1が使用されるようにOnClickListenerので、finish()方法を持っていません。

2

Activityインスタンスを指します。後者の場合、あなたはそのthisクラスのインスタンスを参照new View.OnClickListener()でインスタンス化anonymousinnerクラスを持っています。それぞれの匿名の内部クラスは、インスタンス化された外部クラスへの暗黙の参照を持ちます。finish()を呼び出すとき、その参照は暗黙的に使用されます。つまり、OuterClassName.this.finish()です。

どのようにそれは第二のスニペットで働いていますか?

コンパイラは、外部クラスインスタンスへの参照を内部クラスに渡す必要があります。外部クラスインスタンスへの参照をコンストラクタパラメータとして追加することによって、内部クラスの各コンストラクタを変更します。


参考:Core Java Volume I - Fundamentals, 9th Edition、章6.4:内部クラス、ページ@Gabe Sechanとして309


匿名の内部クラスを使用OuterClassName.this内外部クラスを参照するために、指摘しました。参考:How do you get a reference to the enclosing class from an anonymous inner class in Java?

+1

OPの場合、何らかの理由で親のものを使用する必要がある場合は、MyParentClassNameを使用します。これは –

関連する問題