当 PagerAdapter 调用 notifyDataSetChanged() override TabLayout class 和 Exception 时,TabLayout 删除所有选项卡
TabLayout removes all tabs when PagerAdapter invoke notifyDataSetChanged() override TabLayout class and Exception
我以前在 TabLayout 中使用文本作为标题,但我决定更改为图标,在 onCreateView
使用 tabLayout.getTabAt(0).setIcon(R.drawable.ic)
。但是,当我通过 notifyDataSetChanged() 更新 PagerArray 中的数据集时,所有选项卡都变为空。我发现:Issue 202402
他们编写的解决方案是创建新的 Class 扩展 TabLayout。所以我做到了:
public class SuperTabLayout extends TabLayout {
public SuperTabLayout(Context context) {
super(context);
}
@Override
public void addTab(Tab tab, boolean setSelected) {
tab.setIcon(R.drawable.ic_assessment_24dp);
super.addTab(tab, setSelected);
}
}
他们写作时不要忘记布局
<com.paragraf.workhours.SuperTabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tablay1"
android:layout_below="@+id/ivPersonAvatar"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
class="com.paragraf.workhours.SuperTabLayout"
/>
但我得到了这样的东西:
10-17 21:07:18.600 28964-28964/com.paragrafxv.workhours E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.paragrafxv.workhours, PID: 28964
android.view.InflateException: Binary XML file line #23: Binary XML file line #23: Error inflating class com.paragrafxv.workhours.SuperTabLayout
at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at com.paragrafxv.workhours.SitePersonFragment.onCreateView(SitePersonFragment.java:86)
at android.app.Fragment.performCreateView(Fragment.java:2220)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
at android.app.BackStackRecord.run(BackStackRecord.java:793)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)
at android.app.FragmentManagerImpl.run(FragmentManager.java:482)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5539)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: android.view.InflateException: Binary XML file line #23: Error inflating class com.paragrafxv.workhours.SuperTabLayout
at android.view.LayoutInflater.createView(LayoutInflater.java:628)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at com.paragrafxv.workhours.SitePersonFragment.onCreateView(SitePersonFragment.java:86)
at android.app.Fragment.performCreateView(Fragment.java:2220)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
at android.app.BackStackRecord.run(BackStackRecord.java:793)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)
at android.app.FragmentManagerImpl.run(FragmentManager.java:482)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5539)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
at java.lang.Class.getConstructor(Class.java:528)
at java.lang.Class.getConstructor(Class.java:492)
at android.view.LayoutInflater.createView(LayoutInflater.java:592)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at com.paragrafxv.workhours.SitePersonFragment.onCreateView(SitePersonFragment.java:86)
at android.app.Fragment.performCreateView(Fragment.java:2220)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
at android.app.BackStackRecord.run(BackStackRecord.java:793)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)
at android.app.FragmentManagerImpl.run(FragmentManager.java:482)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5539)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
有人吗?
您需要实现所有父 class' 构造函数。具体来说:
- TabLayout(Context)(手动创建时使用)
- TabLayout(Context, AttributeSet)(从XML充气时使用)
- TabLayout(Context, AttributeSet, int)(使用样式属性从 XML 膨胀时使用)
由于您没有声明第二个,因此您的 SuperTabLayout
无法从 XML 使用。
你是故意在调用tab.setIcon()
之后调用super.addTab(tab, setSelected)
吗?这可能是问题所在。
我以前在 TabLayout 中使用文本作为标题,但我决定更改为图标,在 onCreateView
使用 tabLayout.getTabAt(0).setIcon(R.drawable.ic)
。但是,当我通过 notifyDataSetChanged() 更新 PagerArray 中的数据集时,所有选项卡都变为空。我发现:Issue 202402
他们编写的解决方案是创建新的 Class 扩展 TabLayout。所以我做到了:
public class SuperTabLayout extends TabLayout {
public SuperTabLayout(Context context) {
super(context);
}
@Override
public void addTab(Tab tab, boolean setSelected) {
tab.setIcon(R.drawable.ic_assessment_24dp);
super.addTab(tab, setSelected);
}
}
他们写作时不要忘记布局
<com.paragraf.workhours.SuperTabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tablay1"
android:layout_below="@+id/ivPersonAvatar"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
class="com.paragraf.workhours.SuperTabLayout"
/>
但我得到了这样的东西:
10-17 21:07:18.600 28964-28964/com.paragrafxv.workhours E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.paragrafxv.workhours, PID: 28964
android.view.InflateException: Binary XML file line #23: Binary XML file line #23: Error inflating class com.paragrafxv.workhours.SuperTabLayout
at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at com.paragrafxv.workhours.SitePersonFragment.onCreateView(SitePersonFragment.java:86)
at android.app.Fragment.performCreateView(Fragment.java:2220)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
at android.app.BackStackRecord.run(BackStackRecord.java:793)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)
at android.app.FragmentManagerImpl.run(FragmentManager.java:482)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5539)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: android.view.InflateException: Binary XML file line #23: Error inflating class com.paragrafxv.workhours.SuperTabLayout
at android.view.LayoutInflater.createView(LayoutInflater.java:628)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at com.paragrafxv.workhours.SitePersonFragment.onCreateView(SitePersonFragment.java:86)
at android.app.Fragment.performCreateView(Fragment.java:2220)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
at android.app.BackStackRecord.run(BackStackRecord.java:793)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)
at android.app.FragmentManagerImpl.run(FragmentManager.java:482)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5539)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
at java.lang.Class.getConstructor(Class.java:528)
at java.lang.Class.getConstructor(Class.java:492)
at android.view.LayoutInflater.createView(LayoutInflater.java:592)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:764)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at com.paragrafxv.workhours.SitePersonFragment.onCreateView(SitePersonFragment.java:86)
at android.app.Fragment.performCreateView(Fragment.java:2220)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
at android.app.BackStackRecord.run(BackStackRecord.java:793)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)
at android.app.FragmentManagerImpl.run(FragmentManager.java:482)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5539)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
有人吗?
您需要实现所有父 class' 构造函数。具体来说:
- TabLayout(Context)(手动创建时使用)
- TabLayout(Context, AttributeSet)(从XML充气时使用)
- TabLayout(Context, AttributeSet, int)(使用样式属性从 XML 膨胀时使用)
由于您没有声明第二个,因此您的 SuperTabLayout
无法从 XML 使用。
你是故意在调用tab.setIcon()
之后调用super.addTab(tab, setSelected)
吗?这可能是问题所在。