ViewPager:重新创建活动后,一个片段保持空虚
我有一个带有两个片段的ViewPager。两者都加载后,
- 我会更改语言或应用程序的黑暗模式,
- 因此重新创建了基础活动(我认为这是触发错误的原因),
- 然后我导航回ViewPager,
- 这是两个片段之一(然后是两个片段之一)(总是第一个)只是空。它没有加载,没有响应点击,也无能为力。重新创建另一个人,就像魅力一样。
包含ViewPager的片段:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mBinding = MyFragmentBinding.inflate(inflater, container, false);
View view = mBinding.getRoot();
viewPager = mBinding.pageTabber;
pageAdapter = new MyPageAdapter(getActivity(), getActivity(), this);
viewPager.setAdapter(pageAdapter);
new TabLayoutMediator(mBinding.tabLayout, viewPager,
new TabLayoutMediator.TabConfigurationStrategy() {
@Override
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
if (getContext() == null) {
return;
}
switch (position) {
case 0:
tab.setText(...);
break;
case 1:
tab.setText(...);
break;
default:
break;
}
}
}
).attach();
viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
public void onPageScrollStateChanged(int state) {}
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
public void onPageSelected(int position) {
// ...
}
});
}
mypageadapter:
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
public class MyPageAdapter extends FragmentStateAdapter {
private int nr = -1;
private Context context;
private static final int FRAGMENT_COUNT = 2;
public MyPageAdapter(@NonNull FragmentActivity fm, Context context) {
super(fm);
this.context = context;
}
public MyPageAdapter(@NonNull FragmentActivity fm, int nr, Context context) {
super(fm);
this.nr = nr;
this.context = context;
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
@NonNull
@Override
public Fragment createFragment(int position) {
if (position == 0) {
return new Fragment1();
} else {
return new Fragment2();
}
}
@Override
public int getItemCount() {
return FRAGMENT_COUNT;
}
}
我已将日志添加到片段的生命周期中,以便理解它。 包装fragments
是包含ViewPager的片段。
// navigating to the fragment that contains the ViewPager
2022-07-03 12:34:02.502 23112-23112/Log: WrappingFragment: onAttach
2022-07-03 12:34:02.502 23112-23112/Log: WrappingFragment: onCreateView
2022-07-03 12:34:02.624 23112-23112/Log: WrappingFragment: onResume
2022-07-03 12:34:02.675 23112-23112/Log: Fragment1: onAttach
2022-07-03 12:34:02.676 23112-23112/Log: Fragment1: onCreateView
2022-07-03 12:34:02.737 23112-23112/Log: Fragment1: onResume
// in the ViewPager: navigating to Fragment2
2022-07-03 12:34:32.114 23112-23112/Log: Fragment2: onAttach
2022-07-03 12:34:32.114 23112-23112/Log: Fragment2: onCreateView
2022-07-03 12:34:32.416 23112-23112/Log: Fragment1: onPause
2022-07-03 12:34:32.416 23112-23112/Log: Fragment2: onResume
// navigating to a different activity in order to change the dark mode setting
2022-07-03 12:34:53.209 23112-23112/Log: WrappingFragment: onPause
2022-07-03 12:34:54.594 23112-23112/Log: Fragment2: onPause
2022-07-03 12:34:55.368 23112-23112/Log: WrappingFragment: onStop
2022-07-03 12:34:55.368 23112-23112/Log: Fragment1: onStop
2022-07-03 12:34:55.368 23112-23112/Log: Fragment2: onStop
// Changing the dark mode setting
2022-07-03 12:35:09.957 23112-23112/Log: WrappingFragment: onDestroyView
2022-07-03 12:35:09.957 23112-23112/Log: WrappingFragment: onDestroy
2022-07-03 12:35:09.957 23112-23112/Log: WrappingFragment: onDetach
2022-07-03 12:35:09.958 23112-23112/Log: Fragment1: onDestroyView
2022-07-03 12:35:09.958 23112-23112/Log: Fragment1: onDestroy
2022-07-03 12:35:09.959 23112-23112/Log: Fragment1: onDetach
2022-07-03 12:35:09.959 23112-23112/Log: Fragment2: onCreateView
2022-07-03 12:35:09.959 23112-23112/Log: Fragment2: onCreateView
2022-07-03 12:35:09.960 23112-23112/Log: Fragment2: onDetach
2022-07-03 12:35:09.987 23112-23112/Log: WrappingFragment: onAttach
2022-07-03 12:35:09.987 23112-23112/Log: Fragment1: onAttach
2022-07-03 12:35:09.988 23112-23112/Log: Fragment2: onAttach
2022-07-03 12:35:10.165 23112-23112/Log: WrappingFragment: onCreateView
2022-07-03 12:35:10.226 23112-23112/Log: Fragment1: onCreateView
2022-07-03 12:35:10.246 23112-23112/Log: Fragment2: onCreateView
2022-07-03 12:35:10.360 23112-23112/Log: Fragment2: onResume
2022-07-03 12:35:10.378 23112-23112/Log: Fragment2: onPause
2022-07-03 12:35:10.389 23112-23112/Log: WrappingFragment: onStop
2022-07-03 12:35:10.389 23112-23112/Log: Fragment1: onStop
2022-07-03 12:35:10.390 23112-23112/Log: Fragment2: onStop
// navigating back to the other activity (where all the fragments are in)
2022-07-03 12:50:22.049 23112-23112/Log: Fragment2: onResume
2022-07-03 12:50:22.087 23112-23112/Log: WrappingFragment: onStop
2022-07-03 12:50:22.087 23112-23112/Log: WrappingFragment: onDestroyView
2022-07-03 12:50:22.088 23112-23112/Log: WrappingFragment: onDestroy
2022-07-03 12:50:22.088 23112-23112/Log: WrappingFragment: onDetach
// navigating to the Fragment that contains the ViewPager (the viewpager starts in fragment2 as when I navigated out of this, we were in fragment2)
2022-07-03 12:50:37.822 23112-23112/Log: WrappingFragment: onAttach
2022-07-03 12:50:37.822 23112-23112/Log: WrappingFragment: onCreateView
2022-07-03 12:50:37.880 23112-23112/Log: WrappingFragment: onResume
// in the ViewPager going to Fragment1
2022-07-03 12:50:47.322 23112-23112/Log: Fragment2: onPause
2022-07-03 12:50:47.323 23112-23112/Log: Fragment1: onResume
但是我只是找不到错误。
I have a ViewPager with two Fragments in it. When both are loaded,
- I change the language, or the Dark Mode of the app,
- So the underlying Activity is recreated (I think this is what triggers the bug),
- Then I navigate back to the viewpager,
- Then one of the two fragments (always the first one) is just empty. It doesn't load, it doesn't respond to clicks, it doesn't do anything. While the other one is recreated and works like a charm.
Fragment that contains the ViewPager:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mBinding = MyFragmentBinding.inflate(inflater, container, false);
View view = mBinding.getRoot();
viewPager = mBinding.pageTabber;
pageAdapter = new MyPageAdapter(getActivity(), getActivity(), this);
viewPager.setAdapter(pageAdapter);
new TabLayoutMediator(mBinding.tabLayout, viewPager,
new TabLayoutMediator.TabConfigurationStrategy() {
@Override
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
if (getContext() == null) {
return;
}
switch (position) {
case 0:
tab.setText(...);
break;
case 1:
tab.setText(...);
break;
default:
break;
}
}
}
).attach();
viewPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
public void onPageScrollStateChanged(int state) {}
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
public void onPageSelected(int position) {
// ...
}
});
}
MyPageAdapter:
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
public class MyPageAdapter extends FragmentStateAdapter {
private int nr = -1;
private Context context;
private static final int FRAGMENT_COUNT = 2;
public MyPageAdapter(@NonNull FragmentActivity fm, Context context) {
super(fm);
this.context = context;
}
public MyPageAdapter(@NonNull FragmentActivity fm, int nr, Context context) {
super(fm);
this.nr = nr;
this.context = context;
}
@Override
public long getItemId(int position) {
return super.getItemId(position);
}
@NonNull
@Override
public Fragment createFragment(int position) {
if (position == 0) {
return new Fragment1();
} else {
return new Fragment2();
}
}
@Override
public int getItemCount() {
return FRAGMENT_COUNT;
}
}
I have added logs to the lifecycles of the Fragments in order to understand it. WrappingFragments
is the Fragment that contains the ViewPager.
// navigating to the fragment that contains the ViewPager
2022-07-03 12:34:02.502 23112-23112/Log: WrappingFragment: onAttach
2022-07-03 12:34:02.502 23112-23112/Log: WrappingFragment: onCreateView
2022-07-03 12:34:02.624 23112-23112/Log: WrappingFragment: onResume
2022-07-03 12:34:02.675 23112-23112/Log: Fragment1: onAttach
2022-07-03 12:34:02.676 23112-23112/Log: Fragment1: onCreateView
2022-07-03 12:34:02.737 23112-23112/Log: Fragment1: onResume
// in the ViewPager: navigating to Fragment2
2022-07-03 12:34:32.114 23112-23112/Log: Fragment2: onAttach
2022-07-03 12:34:32.114 23112-23112/Log: Fragment2: onCreateView
2022-07-03 12:34:32.416 23112-23112/Log: Fragment1: onPause
2022-07-03 12:34:32.416 23112-23112/Log: Fragment2: onResume
// navigating to a different activity in order to change the dark mode setting
2022-07-03 12:34:53.209 23112-23112/Log: WrappingFragment: onPause
2022-07-03 12:34:54.594 23112-23112/Log: Fragment2: onPause
2022-07-03 12:34:55.368 23112-23112/Log: WrappingFragment: onStop
2022-07-03 12:34:55.368 23112-23112/Log: Fragment1: onStop
2022-07-03 12:34:55.368 23112-23112/Log: Fragment2: onStop
// Changing the dark mode setting
2022-07-03 12:35:09.957 23112-23112/Log: WrappingFragment: onDestroyView
2022-07-03 12:35:09.957 23112-23112/Log: WrappingFragment: onDestroy
2022-07-03 12:35:09.957 23112-23112/Log: WrappingFragment: onDetach
2022-07-03 12:35:09.958 23112-23112/Log: Fragment1: onDestroyView
2022-07-03 12:35:09.958 23112-23112/Log: Fragment1: onDestroy
2022-07-03 12:35:09.959 23112-23112/Log: Fragment1: onDetach
2022-07-03 12:35:09.959 23112-23112/Log: Fragment2: onCreateView
2022-07-03 12:35:09.959 23112-23112/Log: Fragment2: onCreateView
2022-07-03 12:35:09.960 23112-23112/Log: Fragment2: onDetach
2022-07-03 12:35:09.987 23112-23112/Log: WrappingFragment: onAttach
2022-07-03 12:35:09.987 23112-23112/Log: Fragment1: onAttach
2022-07-03 12:35:09.988 23112-23112/Log: Fragment2: onAttach
2022-07-03 12:35:10.165 23112-23112/Log: WrappingFragment: onCreateView
2022-07-03 12:35:10.226 23112-23112/Log: Fragment1: onCreateView
2022-07-03 12:35:10.246 23112-23112/Log: Fragment2: onCreateView
2022-07-03 12:35:10.360 23112-23112/Log: Fragment2: onResume
2022-07-03 12:35:10.378 23112-23112/Log: Fragment2: onPause
2022-07-03 12:35:10.389 23112-23112/Log: WrappingFragment: onStop
2022-07-03 12:35:10.389 23112-23112/Log: Fragment1: onStop
2022-07-03 12:35:10.390 23112-23112/Log: Fragment2: onStop
// navigating back to the other activity (where all the fragments are in)
2022-07-03 12:50:22.049 23112-23112/Log: Fragment2: onResume
2022-07-03 12:50:22.087 23112-23112/Log: WrappingFragment: onStop
2022-07-03 12:50:22.087 23112-23112/Log: WrappingFragment: onDestroyView
2022-07-03 12:50:22.088 23112-23112/Log: WrappingFragment: onDestroy
2022-07-03 12:50:22.088 23112-23112/Log: WrappingFragment: onDetach
// navigating to the Fragment that contains the ViewPager (the viewpager starts in fragment2 as when I navigated out of this, we were in fragment2)
2022-07-03 12:50:37.822 23112-23112/Log: WrappingFragment: onAttach
2022-07-03 12:50:37.822 23112-23112/Log: WrappingFragment: onCreateView
2022-07-03 12:50:37.880 23112-23112/Log: WrappingFragment: onResume
// in the ViewPager going to Fragment1
2022-07-03 12:50:47.322 23112-23112/Log: Fragment2: onPause
2022-07-03 12:50:47.323 23112-23112/Log: Fragment1: onResume
But I just cannot find an error.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论