10-15 15:52:00.094 3808 3808 E AndroidRuntime: FATAL EXCEPTION: main
10-15 15:52:00.094 3808 3808 E AndroidRuntime: Process: com.xxxx.xxx, PID: 3808
10-15 15:52:00.094 3808 3808 E AndroidRuntime: java.lang.IllegalStateException: Fragment already added
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at androidx.fragment.app.Fragment.setInitialSavedState(Fragment.java:679)
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at androidx.viewpager2.adapter.FragmentStateAdapter.ensureFragment(FragmentStateAdapter.java:269)
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at androidx.viewpager2.adapter.FragmentStateAdapter.onBindViewHolder(FragmentStateAdapter.java:175)
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at androidx.viewpager2.adapter.FragmentStateAdapter.onBindViewHolder(FragmentStateAdapter.java:67)
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at androidx.recyclerview.widget.RecyclerView
A
d
a
p
t
e
r
.
o
n
B
i
n
d
V
i
e
w
H
o
l
d
e
r
(
R
e
c
y
c
l
e
r
V
i
e
w
.
j
a
v
a
:
7065
)
10
−
1515
:
52
:
00.09438083808
E
A
n
d
r
o
i
d
R
u
n
t
i
m
e
:
a
t
a
n
d
r
o
i
d
x
.
r
e
c
y
c
l
e
r
v
i
e
w
.
w
i
d
g
e
t
.
R
e
c
y
c
l
e
r
V
i
e
w
Adapter.onBindViewHolder(RecyclerView.java:7065) 10-15 15:52:00.094 3808 3808 E AndroidRuntime: at androidx.recyclerview.widget.RecyclerView
Adapter.onBindViewHolder(RecyclerView.java:7065)10−1515:52:00.09438083808EAndroidRuntime:atandroidx.recyclerview.widget.RecyclerViewAdapter.bindViewHolder(RecyclerView.java:7107)
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at androidx.recyclerview.widget.RecyclerView
R
e
c
y
c
l
e
r
.
t
r
y
B
i
n
d
V
i
e
w
H
o
l
d
e
r
B
y
D
e
a
d
l
i
n
e
(
R
e
c
y
c
l
e
r
V
i
e
w
.
j
a
v
a
:
6012
)
10
−
1515
:
52
:
00.09438083808
E
A
n
d
r
o
i
d
R
u
n
t
i
m
e
:
a
t
a
n
d
r
o
i
d
x
.
r
e
c
y
c
l
e
r
v
i
e
w
.
w
i
d
g
e
t
.
R
e
c
y
c
l
e
r
V
i
e
w
Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012) 10-15 15:52:00.094 3808 3808 E AndroidRuntime: at androidx.recyclerview.widget.RecyclerView
Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)10−1515:52:00.09438083808EAndroidRuntime:atandroidx.recyclerview.widget.RecyclerViewRecycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at androidx.recyclerview.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:288)
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at androidx.recyclerview.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:345)
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at androidx.recyclerview.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:361)
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at androidx.recyclerview.widget.GapWorker.prefetch(GapWorker.java:368)
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at androidx.recyclerview.widget.GapWorker.run(GapWorker.java:399)
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:755)
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at android.os.Looper.loop(Looper.java:154)
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6141)
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:913)
10-15 15:52:00.094 3808 3808 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:803)
报错AndroidRuntime: at androidx.fragment.app.Fragment.setInitialSavedState(Fragment.java:679)
这个错误是我从 fragment A 切换到 fragment B ,
fragment B再切换到 fragment C 中,
再切换到 fragment B中, fragment B 里面 使用了ViewPager2 + FragmentStateAdapter + RadioButton切换主题,问题就出在我使用的ViewPager2 + FragmentStateAdapter这里。
每次我在多个fragmentA,B,C之间多次切换后,切换到fragment B,点击 radioButton 通知ViewPager2 切换 fragment的主题时,使用方法viewPager2.setCurrentItem(index);,就报上面的错误。
我在想,是否是滑动效果的问题,于是 用
viewPager2.setCurrentItem(index,false);然后,由于viewpager2 里面的fragment 里面有recycleviewer ,把viewpager2 的宽高 固定 ,问题解决。
总结:1,viewPager2.setCurrentItem(index)改成viewPager2.setCurrentItem(index,false);
2,viewPager2 在布局文件里面把宽高 固定。