如何覆盖默认方法?

问题描述 投票:0回答:3

我们在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();
        }

但如果我删除,导航抽屉工作正常。我们想从那里调试。

android override navigation-drawer
3个回答
0
投票

我们得到这个代码,不能改变。

那是来自图书馆。您无法修改库的编译版本。

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

扩展任何Java类drawer(可能是DrawerLayout)并覆盖那里的addDrawerListener(),添加你的逻辑并链接到现有逻辑的超类实现。然后,无论您在哪里定义drawer,都要使用您的子类而不是基类。


2
投票

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

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


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建议,另一个选择是扩展课程

© www.soinside.com 2019 - 2024. All rights reserved.