Viewpager 片段变成空白
Viewpager Fragments turning blank
在片段内使用带有 Viewpager 的 PagerSlidingTabStrip:
- 主要 Activity 包含一个 "main fragment",它会根据您在导航抽屉中单击的项目而变化。
- 加载包含 Viewpager 的初始片段时,一切正常(所有页面都已填充)。
- 将主片段替换为另一个片段,然后返回到 viewpager 片段,将 viewpager 中的每一页变为空白,但 PagerSlidingTabStrip 选项卡仍然存在。
有什么想法吗?
编写您的代码,即您用于在内部设置寻呼机适配器的代码
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
pager.setAdapter(adapter);
}
我遇到过这样的问题
试试这个
mPager.setAdapter(new BasePagerAdapter(getChildFragmentManager(), getResources()));
你可能有这个
mPager.setAdapter(new BasePagerAdapter(getFragmentManager(), getResources()));
编辑:
并在您的 BasePagerAdapter 中扩展 FragmentStatePagerAdapter
public class BasePagerAdapter extends FragmentStatePagerAdapter {
用 getChildFragmentManager()
替换 getFragmentManager()
对我很有帮助。
很抱歉回复旧的 post,但写这篇文章是因为没有针对我的特定问题的 Whosebug 解决方案帮助了我。
如果您将新的架构组件视图模型与主细节共享视图模型一起使用,并且在从细节片段返回后获得空白视图寻呼机,请在主片段的 onViewCreated
方法中执行视图模型初始化,而不是在onCreate
(仅在主片段中需要)。
另外,正如其他答案所说,记得在视图寻呼机适配器中使用 childFragmentManager。
像这样:
class SharedViewModel : ViewModel() {
val selected = MutableLiveData<Item>()
fun select(item: Item) {
selected.value = item
}
}
class MasterFragment : Fragment() {
private lateinit var itemSelector: Selector
private lateinit var model: SharedViewModel
// In the master fragment do the view model initialization in onViewCreated
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
model = activity?.run {
ViewModelProviders.of(this).get(SharedViewModel::class.java)
} ?: throw Exception("Invalid Activity")
model.selected.observe(this, Observer<Item> { item ->
// Update the UI
})
}
}
class DetailFragment : Fragment() {
private lateinit var model: SharedViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
model = activity?.run {
ViewModelProviders.of(this).get(SharedViewModel::class.java)
} ?: throw Exception("Invalid Activity")
model.selected.observe(this, Observer<Item> { item ->
// Update the UI
})
}
}
在片段内使用带有 Viewpager 的 PagerSlidingTabStrip:
- 主要 Activity 包含一个 "main fragment",它会根据您在导航抽屉中单击的项目而变化。
- 加载包含 Viewpager 的初始片段时,一切正常(所有页面都已填充)。
- 将主片段替换为另一个片段,然后返回到 viewpager 片段,将 viewpager 中的每一页变为空白,但 PagerSlidingTabStrip 选项卡仍然存在。
有什么想法吗?
编写您的代码,即您用于在内部设置寻呼机适配器的代码
@Override
public void onResume() {
// TODO Auto-generated method stub
super.onResume();
pager.setAdapter(adapter);
}
我遇到过这样的问题
试试这个
mPager.setAdapter(new BasePagerAdapter(getChildFragmentManager(), getResources()));
你可能有这个
mPager.setAdapter(new BasePagerAdapter(getFragmentManager(), getResources()));
编辑: 并在您的 BasePagerAdapter 中扩展 FragmentStatePagerAdapter
public class BasePagerAdapter extends FragmentStatePagerAdapter {
用 getChildFragmentManager()
替换 getFragmentManager()
对我很有帮助。
很抱歉回复旧的 post,但写这篇文章是因为没有针对我的特定问题的 Whosebug 解决方案帮助了我。
如果您将新的架构组件视图模型与主细节共享视图模型一起使用,并且在从细节片段返回后获得空白视图寻呼机,请在主片段的 onViewCreated
方法中执行视图模型初始化,而不是在onCreate
(仅在主片段中需要)。
另外,正如其他答案所说,记得在视图寻呼机适配器中使用 childFragmentManager。
像这样:
class SharedViewModel : ViewModel() {
val selected = MutableLiveData<Item>()
fun select(item: Item) {
selected.value = item
}
}
class MasterFragment : Fragment() {
private lateinit var itemSelector: Selector
private lateinit var model: SharedViewModel
// In the master fragment do the view model initialization in onViewCreated
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
model = activity?.run {
ViewModelProviders.of(this).get(SharedViewModel::class.java)
} ?: throw Exception("Invalid Activity")
model.selected.observe(this, Observer<Item> { item ->
// Update the UI
})
}
}
class DetailFragment : Fragment() {
private lateinit var model: SharedViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
model = activity?.run {
ViewModelProviders.of(this).get(SharedViewModel::class.java)
} ?: throw Exception("Invalid Activity")
model.selected.observe(this, Observer<Item> { item ->
// Update the UI
})
}
}