最近項目中使用Tablayout監聽tab切換事件的時候遇到如下問題:
java.lang.IncompatibleClassChangeError: Class 'xxx.RobotDetailActivity' does not implement interface 'com.google.android.material.tabs.TabLayout$BaseOnTabSelectedListener' in call to 'void com.google.android.material.tabs.TabLayout$BaseOnTabSelectedListener.onTabUnselected(com.google.android.material.tabs.TabLayout$Tab)'
先說說我的解決方案,將“new TabLayout.OnTabSelectedListener()”換成“new TabLayout.BaseOnTabSelectedListener()”。
最近項目中遇到一個需要單獨使用tablayout的場景,於是乎就開始擼碼,
佈局:
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabs_tobots"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/background_white_bottom_line"
android:minHeight="40dp"
app:tabBackground="@color/transparent"
app:tabIndicatorColor="@color/tab_indicator"
app:tabIndicatorFullWidth="false"
app:tabMode="scrollable"
app:tabRippleColor="@color/transparent"
app:tabSelectedTextColor="@color/tab_selected_text_blue"
app:tabTextColor="@color/main_gray" />
事件:
viewDataBinding.tabsTobots.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
showToast(" "+tab.getText());
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
調試:
。。。。。。。。。。。。。。
App崩潰!!!不是吧,一個tablayout也會崩,查看了日誌,發現:
java.lang.IncompatibleClassChangeError: Class 'xxx.RobotDetailActivity' does not implement interface 'com.google.android.material.tabs.TabLayout$BaseOnTabSelectedListener' in call to 'void com.google.android.material.tabs.TabLayout$BaseOnTabSelectedListener.onTabUnselected(com.google.android.material.tabs.TabLayout$Tab)'
。。。
大致意思是:你要調用BaseOnTabSelectedListener.onTabUnselected方法但是你沒實現BaseOnTabSelectedListener接口
重點:BaseOnTabSelectedListener
帶着疑惑,點開OnTabSelectedListener,看到代碼:
public interface OnTabSelectedListener extends TabLayout.BaseOnTabSelectedListener<TabLayout.Tab> {
}
public interface BaseOnTabSelectedListener<T extends TabLayout.Tab> {
void onTabSelected(T var1);
void onTabUnselected(T var1);
void onTabReselected(T var1);
}
OnTabSelectedListener 繼承了BaseOnTabSelectedListener的呀,完全沒問題呀,肯定是編譯器又抽風了,
於是乎將監聽方法改爲BaseOnTabSelectedListener,
viewDataBinding.tabsTobots.addOnTabSelectedListener(new TabLayout.BaseOnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
showToast(" "+tab.getText());
ChangeVideo();
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
打包,測試,ok了!
此問題還沒找到原因,希望有大佬知道的話幫忙解答,感激不盡!