片段在 ViewPager 中为空白
Fragment is blank in ViewPager
首先:我知道有很多类似的问题,但是 none 的建议有效。
我有一个要与片段一起使用的 ViewPager。 ViewPager 有效,我可以在日志中看到我可以左右滚动。当我尝试向左滚动并且没有上一个项目时(或者当没有下一个项目时向右滚动),我可以看到动画。但是,屏幕仍然空白。该片段本身是功能性的,但是,我在不同的上下文中尝试过它。
我正在使用 androidx
命名空间包。
我试过的东西(<-->
表示我都试过):
FragmentPagerAdapter
<--> FragmentStatePagerAdapter
getFragmentManager()
<--> getChildFragmentManager()
作为适配器的 FragmentManager
setSaveFromParentEnabled
为假。
setOffscreenPageLimit
到片段数
相关代码(我把与本题无关的部分代码都去掉了):
包含ViewPager
的Fragment
:
public class AddListingMediaFragment extends Fragment {
private ViewPager viewPagerTop;
private AddMediaAdapter addMediaAdapter;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_add_listing_media, container, false);
setupViewPagerTop(view);
return view;
}
private void setupViewPagerTop(View view) {
viewPagerTop = view.findViewById(R.id.view_pager_top);
addMediaAdapter = new AddMediaAdapter(getChildFragmentManager());
viewPagerTop.setAdapter(addMediaAdapter);
viewPagerTop.setSaveFromParentEnabled(false);
viewPagerTop.setOffscreenPageLimit(5);
}
}
Adapter
(请注意,如前所述,我已经尝试了 FragmentPagerAdapter
和 FragmentStatePagerAdapter
:
public class AddMediaAdapter extends FragmentPagerAdapter {
private static final String TAG = AddMediaAdapter.class.getSimpleName();
public AddMediaAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 5;
}
@Override
public Fragment getItem(int position) {
Log.i(TAG, "getItem: " + String.valueOf(position));
return new AddListingMediaCameraFragment();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager_top"
android:layout_width="300dp"
android:layout_height="300dp"
/>
<include
layout="@layout/bottom_sheet_add_listing_media_gallery"
/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
您不需要在您的适配器中重写 isViewFromObject
,FragmentPagerAdapter
已经处理好了。 ViewPager
调用此方法来决定如何呈现页面。
您的 view == object
将 return 为假,因为该对象始终是 Fragment
而不是 View
。所以只要放弃覆盖,它就会解决问题。
首先:我知道有很多类似的问题,但是 none 的建议有效。
我有一个要与片段一起使用的 ViewPager。 ViewPager 有效,我可以在日志中看到我可以左右滚动。当我尝试向左滚动并且没有上一个项目时(或者当没有下一个项目时向右滚动),我可以看到动画。但是,屏幕仍然空白。该片段本身是功能性的,但是,我在不同的上下文中尝试过它。
我正在使用 androidx
命名空间包。
我试过的东西(<-->
表示我都试过):
FragmentPagerAdapter
<-->FragmentStatePagerAdapter
getFragmentManager()
<-->getChildFragmentManager()
作为适配器的FragmentManager
setSaveFromParentEnabled
为假。setOffscreenPageLimit
到片段数
相关代码(我把与本题无关的部分代码都去掉了):
包含ViewPager
的Fragment
:
public class AddListingMediaFragment extends Fragment {
private ViewPager viewPagerTop;
private AddMediaAdapter addMediaAdapter;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_add_listing_media, container, false);
setupViewPagerTop(view);
return view;
}
private void setupViewPagerTop(View view) {
viewPagerTop = view.findViewById(R.id.view_pager_top);
addMediaAdapter = new AddMediaAdapter(getChildFragmentManager());
viewPagerTop.setAdapter(addMediaAdapter);
viewPagerTop.setSaveFromParentEnabled(false);
viewPagerTop.setOffscreenPageLimit(5);
}
}
Adapter
(请注意,如前所述,我已经尝试了 FragmentPagerAdapter
和 FragmentStatePagerAdapter
:
public class AddMediaAdapter extends FragmentPagerAdapter {
private static final String TAG = AddMediaAdapter.class.getSimpleName();
public AddMediaAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return 5;
}
@Override
public Fragment getItem(int position) {
Log.i(TAG, "getItem: " + String.valueOf(position));
return new AddListingMediaCameraFragment();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager_top"
android:layout_width="300dp"
android:layout_height="300dp"
/>
<include
layout="@layout/bottom_sheet_add_listing_media_gallery"
/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
您不需要在您的适配器中重写 isViewFromObject
,FragmentPagerAdapter
已经处理好了。 ViewPager
调用此方法来决定如何呈现页面。
您的 view == object
将 return 为假,因为该对象始终是 Fragment
而不是 View
。所以只要放弃覆盖,它就会解决问题。