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一次,即使从未达到任何或多次使用任何内部类

于 2013-07-21T22:11:01.100 回答
1

通过使用该语法,可以覆盖一个特定实例的类的方法。一个非常常见的用法确实是侦听器或处理程序(例如:MouseListener、KeyListener 等...)。

这会导致您正在扩展的类的匿名子类。子类没有名称。并被编译成WrapperClass$0WrapperClass$1依此类推...

于 2013-07-21T22:10:44.337 回答