使用一些令人困惑的代码初始化ActionBarDrawerToggle

时间:2015-02-13 11:06:24

标签: java android

Android Studio 1.1 Beta 4

您好,

我期待下面的一些源代码,我无法理解它背后的原因。我能理解这部分

 ActionBarDrawerToggle mActionBarDrawerToggle =
                    new ActionBarDrawerToggle(getActivity(), mDrawerLayout, toolbar, R.string.open, R.string.close)

使用带有5个参数的构造函数创建ActionBarDrawerToggle的新实例。

这个令人困惑的部分是为什么之后的括号,我以前从未见过。这是做某事的捷径吗?:

{
    @Override
    public void onDrawerOpened(View drawerView) {
        super.onDrawerOpened(drawerView);
    }

    @Override
    public void onDrawerClosed(View drawerView) {
        super.onDrawerClosed(drawerView);
    }
};

完成:

 private void init() {
        ActionBarDrawerToggle mActionBarDrawerToggle =
                new ActionBarDrawerToggle(getActivity(), mDrawerLayout, toolbar, R.string.open, R.string.close) {
                    @Override
                    public void onDrawerOpened(View drawerView) {
                        super.onDrawerOpened(drawerView);
                    }

                    @Override
                    public void onDrawerClosed(View drawerView) {
                        super.onDrawerClosed(drawerView);
                    }
                };

2 个答案:

答案 0 :(得分:1)

给定的结构:

SomeType st = new SomeType(){
    ...
}

创建匿名子类扩展SomeType并允许覆盖/添加方法,添加成员,进行初始化等

在您的情况下,{}会创建一个扩展ActionBarDrawerToggle并覆盖方法onDrawerOpened()onDrawerClosed()的匿名子类。

P.S。当您只需要上课一次时它非常有用。

答案 1 :(得分:0)

ActionBarDrawerToggle实施DrawerLayout.DrawerListener,其中包含抽象方法。这意味着您必须定义它们。 ActionBarDrawerToggle会自己定义它们,但是你可以在构造函数之后在{}中覆盖它们。实际上,您正在创建ActionBarDrawerToggle的匿名子类。 (没有名字的班级)

您可以在Java documantation

中阅读相关内容