Сбой в setOnTabSelectedListener с com.android.support:design:28.0.0 - PullRequest
0 голосов
/ 19 октября 2018

Я использую библиотеку с классом, который расширяет TabLayout.Я пытаюсь собрать с последними библиотеками поддержки:

implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support:preference-v14:28.0.0'
implementation 'com.android.support:support-v13:28.0.0'

Это приводит к сбою:

java.lang.NoSuchMethodError: No virtual method setOnTabSelectedListener(Landroid/support/design/widget/TabLayout$OnTabSelectedListener;)

Это источник из декомпилированного файла TabLayout.class (Это непохоже, что у jar исходного кода, как в других версиях):

/** @deprecated */
@Deprecated
public void setOnTabSelectedListener(@Nullable TabLayout.BaseOnTabSelectedListener listener) { ... }

public interface OnTabSelectedListener extends TabLayout.BaseOnTabSelectedListener<TabLayout.Tab> {
}

public interface BaseOnTabSelectedListener<T extends TabLayout.Tab> { ... }

Он работает с 27.1.1 и более ранними версиями, где источник выглядит так:

/**
 * @deprecated Use {@link #addOnTabSelectedListener(OnTabSelectedListener)} and
 * {@link #removeOnTabSelectedListener(OnTabSelectedListener)}.
 */
@Deprecated
public void setOnTabSelectedListener(@Nullable OnTabSelectedListener listener) { ... }

/**
 * Callback interface invoked when a tab's selection state changes.
 */
public interface OnTabSelectedListener { ... }

Яработает в Genymotion с Samsung Galaxy S8 - API 26 - 1440x2960.

Я не уверен, есть ли проблема с библиотекой design: 28.0.0 или, возможно, я что-то не так делаю в сборке.Кажется, работает нормально с более ранними версиями.Любой совет приветствуется.

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Вы должны использовать новые зависимости Материальных Компонентов.С этим все работает нормально, и вам просто нужно добавить одну строку в Gradle для импорта всех компонентов дизайна.

implementation 'com.google.android.material:material:1.0.0'

С этой однострочной зависимостью доступны RecyclerView, CardView, TabLayout и все компоненты представления.У вас также будут Chips, CardView, RecyclerView, tec.

Помните, что:

Не следует использовать зависимости com.android.support и com.google.android.material водновременно ваше приложение

Проверьте, как настроить: https://medium.com/nyc-design/material-design-components-setup-on-android-studio-3-2-8b3194d9bebf

0 голосов
/ 19 октября 2018

Я загрузил файл AAR из обеих версий: 27.1.1 и 28.0.0 :

Декомпиляция TabLayout.class из обоих пакетов, я мог видетьего подпись изменилась с:

27.1.1

@Deprecated
public void setOnTabSelectedListener(@Nullable TabLayout.BaseOnTabSelectedListener listener)
}

28.0.0

@Deprecated
public void setOnTabSelectedListener(@Nullable TabLayout.OnTabSelectedListener listener) {
}

Итак,теперь этот метод ожидает BaseOnTabSelectedListener, а не OnTabSelectedListener

Старый onTabSelectedListener не реализует новый BaseOnTabSelectedListener

Так что, вероятно, придется импортировать компонент материала какскважина с новой реализацией OnTabSelectedListener:

implementation 'com.google.android.material:material:1.0.0'

Док старого onTabSelectedListener (не реализует BaseOnTabSelectedListener

Докnew onTabSelectedListener (реализует BaseOnTabSelectedListener).

Извините, но я прямо не показал, как это исправить, потому что сейчас не могу идти дальше. Но это коренная причина, по которой ядумаю.

0 голосов
/ 19 октября 2018
/**
 * @deprecated Use {@link #addOnTabSelectedListener(OnTabSelectedListener)} and
 * {@link #removeOnTabSelectedListener(OnTabSelectedListener)}.
 */

Это-было устарело на уровне API 26.1.0 возможно, именно поэтому вы получаете эту ошибку.

Чтобы исправить это, используйте addOnTabSelectedListener вместо setOnTabSelectedListener

См. к этому ответу .

Пример кода:

tablayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager));
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tablayout));

Примечание: не используйте устаревшие методы.

...