如何覆盖默认方法?

时间:2018-09-01 15:53:22

标签: android override navigation-drawer

我们有 A类

中的这一行代码
 drawer.addDrawerListener(toggle);

ctrl + left click时,我们得到此代码,无法更改。

public void addDrawerListener(@NonNull DrawerListener listener) {
        if (listener == null) {
            return;
        }
        if (mListeners == null) {
            mListeners = new ArrayList<DrawerListener>();
        }
        mListeners.add(listener);
    }

如果侦听器为null,我们希望它显示null,因此我们Override使用此方法并添加到 A类中。

    @Override
    public void addDrawerListener(@NonNull DrawerLayout.DrawerListener listener) {
        if (listener == null) {
            Toast.makeText(getApplication(),"null",Toast.LENGTH_LONG).show();
            return;
        }
        if (mListeners == null) {
            mListeners = new ArrayList<DrawerLayout.DrawerListener>();
        }
        mListeners.add(listener);
    }

但是我们得到了

Method does not override method from its superclass

如果我们想更改addDrawerListener怎么办?

修改

我的课程扩展到AppCompatActivity

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);

        if (savedInstanceState == null) {
            Toast.makeText(getApplication(), "null", Toast.LENGTH_LONG).show();
            RssFragment fragment = new RssFragment();
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.fragment_container, fragment);
            fragmentTransaction.commit();
        }

        drawer.addDrawerListener(toggle);

    }

添加部分代码后,导航抽屉不起作用

 if (savedInstanceState == null) {
            Toast.makeText(getApplication(), "null", Toast.LENGTH_LONG).show();
            RssFragment fragment = new RssFragment();
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.fragment_container, fragment);
            fragmentTransaction.commit();
        }

但是,如果我卸下,导航抽屉会正常工作。我们想从那里调试。

3 个答案:

答案 0 :(得分:2)

这是因为您的 A类不是包含方法DrawerLayout的类addDrawerListener的子类。

如果您确实想覆盖该方法,则需要创建一个扩展类DrawerLayout的新类,并使用该新类实例化抽屉。

答案 1 :(得分:1)

如果要在打开,关闭抽屉时执行某些任务,可以执行以下操作。

 drawer.addDrawerListener(new DrawerLayout.DrawerListener() {
        @Override
        public void onDrawerSlide(@NonNull View drawerView, float slideOffset) {

        }

        @Override
        public void onDrawerOpened(@NonNull View drawerView) {

        }

        @Override
        public void onDrawerClosed(@NonNull View drawerView) {

        }

        @Override
        public void onDrawerStateChanged(int newState) {

        }
    });

此处DrawerListener是在DrawerLayout中声明的接口 我们已经知道,如果在类中实现,则必须实现接口的所有方法

如果您不这样做,Method does not override method from its superclass

在DrawerLayout类中,当您向上滚动时会看到此界面

另一种选择是根据 Nabin Bhandari 的建议

扩展类

答案 2 :(得分:0)

  

我们得到了此代码,无法更改。

那是从图书馆来的。您不能修改库的编译版本。

  

如果我们想更改addDrawerListener怎么办?

扩展任何Java类drawer(可能是DrawerLayout)并在那里覆盖addDrawerListener(),将您的逻辑添加到现有逻辑的超类实现中。然后,在定义drawer的任何地方使用子类而不是基类。