Возможно ли передать подкласс RowsSupportFragment в подкласс BrowseSupportFragment?

#kotlin #android-tv #leanback

#kotlin #android-tv #откат

Вопрос:

Я хочу передать подкласс RowsSupportFragment подклассу BrowseSupportFragment, потому что мне нужно переопределить некоторые методы в RowsSupportFragment, чтобы изменить поведение RowsSupportFragment по умолчанию.

Например, чтобы всегда показывать заголовки строк, переопределив функцию setExpand() на true.

Тот же вопрос относится к подклассу HeadersSupportFragment.

Комментарии:

1. Что вы пробовали до сих пор?

2. Немного, потому что из того, что я вижу, нет способа переопределить класс RowsSupportFragment и передать его подклассу BrowseSupportFragment. Экземпляр RowsSupportFragment создается в BrowseSupportFragment фабрикой, члены являются частными, а внутренние классы являются окончательными. Сама платформа Leanback создает экземпляры RowsSupportFragment и HeadersSupportFragment и не дает вам возможности переопределять эти классы и передавать их подклассу BrowseSupportFragment. Вы можете редактировать только докладчиков, но вы не можете изменить поведение по умолчанию.

Ответ №1:

Не тестировал это, но я считаю, что это должно сработать.

В вашем BrowseSupportFragment создайте пользовательский FragmentFactory для вашего подкласса и переопределите существующее сопоставление списков следующим образом:

 getMainFragmentRegistry().registerFragment(ListRow.class, new FragmentFactory<CustomRowsSupportFragment>() {
            @Override
            public CustomRowsSupportFragment createFragment(Object row) {
                return new CustomRowsSupportFragment();
            }
       }
);
  

Комментарии:

1. MainFragmentAdapterRegistry является конечным классом, поэтому его нельзя расширить

2. @kamilp Нигде в моем ответе я ничего не говорю о расширении MainFragmentAdapterRegistry , я просто регистрирую в нем новый фрагмент.

3. BrowseSupportFragment имеет закрытый элемент, который связывает его с частным MainFragmentAdapterRegistry mMainFragmentAdapterRegistry = new MainFragmentAdapterRegistry(); Нет установщика, поэтому его нельзя вызвать другим способом.

4. @kamilp Вам не нужно его устанавливать, вам просто нужно получить к нему доступ. getMainFragmentRegistry() является общедоступным.

5. Работает, спасибо! mainFragmentRegistry.registerFragment(ListRow::class.java , CustomListRowFragmentFactory()) решает эту проблему