0

Android SDK の NavigationDrawer サンプルを理解しようとしていますが、これに出会いました。

 ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(
            this,                  /* host Activity */
            mDrawerLayout,         /* DrawerLayout object */
            R.drawable.ic_drawer,  /* nav drawer image to replace 'Up' caret */
            R.string.drawer_open,  /* "open drawer" description for accessibility */
            R.string.drawer_close  /* "close drawer" description for accessibility */
            ) {
        public void onDrawerClosed(View view) {
            getActionBar().setTitle(mTitle);
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }

        public void onDrawerOpened(View drawerView) {
            getActionBar().setTitle(mDrawerTitle);
            invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
        }
    };

インスタンス化の直後、これらのメソッドはいつ呼び出されますか? 私はこの構文に慣れていません。これはどのように作動しますか?ありがとう

4

2 に答える 2

3

これは匿名の内部クラスです。0 個以上の抽象メソッドを持つインターフェースまたはクラス Foo が与えられた場合、以下を使用できます。

Foo blech=new Foo(){
    void bar(int baz){
        System.out.println("quux");
    }
}

メソッドを実装またはオーバーライドして Foo のインスタンスを作成します。すべての抽象メソッド (0 の場合もある) は中かっこで実装する必要があります。コンストラクターは通常どおり呼び出され、パラメーターは括弧内に渡すことができます。

これらは、実行する必要があるリスナーやその他のオブジェクトによく使用され、それらを拡張または実装する新しいクラスを作成せずに、さまざまなアクションを指定する必要があります。

これらは[Outer Class]$[Number].class、コードで使用される匿名内部クラスごとに 1 回にコンパイルされます。

于 2013-07-21T22:11:01.100 に答える
1

その構文を使用して、1 つの特定のインスタンスのクラスのメソッドをオーバーライドすることができます。非常に一般的な使用法は、確かにリスナーまたはハンドラーです (例: MouseListener、KeyListener など)。

これにより、拡張しているクラスの無名サブクラスが作成されます。サブクラスには名前がありません。などにコンパイルさWrapperClass$0WrapperClass$1ます...

于 2013-07-21T22:10:44.337 に答える