已创建但未在 Android <= Jelly Bean 上显示的 ViewPager 片段
ViewPager fragments created but not beeing displayed on Android <= Jellybean
我有以下布局:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/parentLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/main_container_1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/main_container_2"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
<FrameLayout
android:id="@+id/leftDrawer"
android:layout_width="@dimen/some_width"
android:layout_height="match_parent"
android:layout_gravity="start"
android:paddingTop="?android:attr/actionBarSize" />
</android.support.v4.widget.DrawerLayout>
</FrameLayout>
我在 main_container_1 中插入了一个片段,它的布局带有以编程方式创建的 viewPager。这是 first 片段
的 OnCreateView
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
var frameLayout = new FrameLayout(Activity)
{
LayoutParameters = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent)
};
_viewPager = new ViewPager(Activity);
//It is required that view pager have an ID othe than -1
_viewPager.Id = 0x00000001;
_viewPager.PageSelected += _viewPager_PageSelected;
_progressBar = new ProgressBar(Activity)
{
LayoutParameters = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent, GravityFlags.Center)
};
frameLayout.AddView(_viewPager);
frameLayout.AddView(_progressBar);
return frameLayout;
}
当然,稍后,我通过 FragmentStatePagerAdapter 将我的数据绑定到 viewPager。
结果: 第一个片段中包含的子片段正常显示
我对 main_container_2 中的 second 片段执行相同的操作,它具有以下 onCreateView
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
_myCustomContainer = (MyCustomLayout)inflater.Inflate(Resource.Layout.MyCustomLayout, container, false);
_viewPager = new ViewPager(Activity);
_myCustomContainer.AddView(_viewPager);
//It is required that view pager have an ID othe than -1
_viewPager.Id = 0x00000001;
return _myCustomContainer;
}
我使用与 first 片段的第一个 viewPager 相同类型的 FragmentStatePagerAdapter。
结果:在 Android 版本低于或等于 Jellybean (API 16) 时,second 片段已 创建 但未显示。
这是我实现 FragmentStatePagerAdapter 的 GetItem 方法
public override Fragment GetItem(int position)
{
if (!ActiveFragments.ContainsKey(position))
{
var fragment = PagedCustomFragment.NewPagedCustomFragment(position);
ActiveFragments[position] = fragment;
}
return ActiveFragments[position];
}
问题:为什么第二个片段的子片段没有显示?
您的两个 ViewPagers 似乎属于同一个父级并且具有相同的 ID,这可能是您问题的根本原因。您是否尝试过为每个 ViewPager 使用不同的 ID?
我有以下布局:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.DrawerLayout
android:id="@+id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/parentLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:id="@+id/main_container_1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<FrameLayout
android:id="@+id/main_container_2"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
<FrameLayout
android:id="@+id/leftDrawer"
android:layout_width="@dimen/some_width"
android:layout_height="match_parent"
android:layout_gravity="start"
android:paddingTop="?android:attr/actionBarSize" />
</android.support.v4.widget.DrawerLayout>
</FrameLayout>
我在 main_container_1 中插入了一个片段,它的布局带有以编程方式创建的 viewPager。这是 first 片段
的 OnCreateView public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
var frameLayout = new FrameLayout(Activity)
{
LayoutParameters = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.MatchParent)
};
_viewPager = new ViewPager(Activity);
//It is required that view pager have an ID othe than -1
_viewPager.Id = 0x00000001;
_viewPager.PageSelected += _viewPager_PageSelected;
_progressBar = new ProgressBar(Activity)
{
LayoutParameters = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WrapContent, ViewGroup.LayoutParams.WrapContent, GravityFlags.Center)
};
frameLayout.AddView(_viewPager);
frameLayout.AddView(_progressBar);
return frameLayout;
}
当然,稍后,我通过 FragmentStatePagerAdapter 将我的数据绑定到 viewPager。
结果: 第一个片段中包含的子片段正常显示
我对 main_container_2 中的 second 片段执行相同的操作,它具有以下 onCreateView
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
_myCustomContainer = (MyCustomLayout)inflater.Inflate(Resource.Layout.MyCustomLayout, container, false);
_viewPager = new ViewPager(Activity);
_myCustomContainer.AddView(_viewPager);
//It is required that view pager have an ID othe than -1
_viewPager.Id = 0x00000001;
return _myCustomContainer;
}
我使用与 first 片段的第一个 viewPager 相同类型的 FragmentStatePagerAdapter。
结果:在 Android 版本低于或等于 Jellybean (API 16) 时,second 片段已 创建 但未显示。
这是我实现 FragmentStatePagerAdapter 的 GetItem 方法
public override Fragment GetItem(int position)
{
if (!ActiveFragments.ContainsKey(position))
{
var fragment = PagedCustomFragment.NewPagedCustomFragment(position);
ActiveFragments[position] = fragment;
}
return ActiveFragments[position];
}
问题:为什么第二个片段的子片段没有显示?
您的两个 ViewPagers 似乎属于同一个父级并且具有相同的 ID,这可能是您问题的根本原因。您是否尝试过为每个 ViewPager 使用不同的 ID?