我正在尝试了解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()
}
};
在实例化后立即调用这些方法?我不熟悉这种语法。这是如何运作的? 感谢
答案 0 :(得分:3)
这是一个匿名的内部类。给定具有0或更多抽象方法的接口或类Foo,您可以使用:
Foo blech=new Foo(){
void bar(int baz){
System.out.println("quux");
}
}
使用已实现或覆盖的方法创建Foo实例。所有抽象方法(其中可能有0)都需要在大括号中实现。仍然像往常一样调用构造函数,并且可以在括号中传递参数。
这些通常用于需要运行的侦听器或其他对象,并且应该指定不同的操作,而不创建扩展或实现它们的新类。
对于代码中使用的每个匿名内部类,这些将编译为[Outer Class]$[Number].class
,即使从未达到任何内容类或任何多次使用
答案 1 :(得分:1)
可以使用该语法覆盖一个特定实例的类的方法。一个非常常见的用法确实是Listeners或Handlers(例如:MouseListener,KeyListener等)。
这会导致您正在扩展的类的匿名子类。子类没有名称。并编译为WrapperClass$0
,WrapperClass$1
等等......