ViewPager片段已创建但未在Android< = Jellybean上显示

时间:2015-02-05 17:17:05

标签: android android-viewpager fragment xamarin.android android-4.2-jelly-bean

我有以下布局:

<?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 的布局。这是第一个片段

的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;
    }

我使用与第一个片段的第一个viewPager相同类型的FragmentStatePagerAdapter。

结果:在Android版本低于或等于Jellybean(API 16)时,第二个片段的子片段已创建但不是显示。

这是我实现FragmentStatePagerAdapter

的GetItem方法
public override Fragment GetItem(int position)
    {
        if (!ActiveFragments.ContainsKey(position))
        {
            var fragment = PagedCustomFragment.NewPagedCustomFragment(position);

            ActiveFragments[position] = fragment;
        }

        return ActiveFragments[position];
    }

问题:为什么第二个片段的子片段没有显示?

1 个答案:

答案 0 :(得分:0)

您的ViewPagers似乎属于同一个父级,并且具有相同的ID,这可能是您的问题的根本原因。您是否尝试为每个ViewPager使用不同的ID?