Как переопределить метод по умолчанию? - PullRequest
0 голосов
/ 01 сентября 2018

У нас есть эта строка кода в Класс 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 голосов
/ 01 сентября 2018

Это потому, что ваш класс A не является подклассом класса DrawerLayout, который содержит метод addDrawerListener.

Если вы действительно хотите переопределить метод, вам нужно будет создать новый класс, расширяющий класс DrawerLayout, и использовать этот новый класс для создания экземпляра вашего ящика.

0 голосов
/ 01 сентября 2018

Вы можете сделать что-то подобное, если хотите выполнить какую-то задачу, когда ящик открыт, закройте.

 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 вы увидите этот интерфейс при прокрутке вверх

Другой вариант - расширить класс как Набин Бхандари предложил

0 голосов
/ 01 сентября 2018

мы получаем этот код, который нельзя изменить.

Это из библиотеки. Вы не можете изменить скомпилированную версию библиотеки.

Что нам делать, если мы хотим изменить addDrawerListener?

Расширьте любой класс Java drawer (DrawerLayout, вероятно) и переопределите addDrawerListener() там, добавив свою логику и связывание в реализацию суперкласса для существующей логики. Затем используйте ваш подкласс вместо базового класса, где бы вы ни определяли drawer.

...