1

我正在尝试通过膨胀 XML 将 View Pagers 动态添加到我的应用程序中。所有视图寻呼机和相应的适配器都被正确实例化,并且所需的片段也被附加。但是,只有第一个视图寻呼机的片段是可见的。对于其他视图寻呼机,我什至可以从一个片段滑动到下一个片段。它们只是不可见。

public class MainActivity extends FragmentActivity {
    private static Integer NUM_PAGERS = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //get layout inflater
        LayoutInflater inflater = LayoutInflater.from(this);
        LinearLayout fragmentPagerLayout = (LinearLayout)     findViewById(R.id.linearLayoutMain);

        for(int index = 0; index < NUM_PAGERS; index++) {
            LinearLayout pagerLayout = (LinearLayout) inflater.inflate(R.layout.view_pager, null);

            //header textview
            TextView pagerHeaderTextView = (TextView) pagerLayout.findViewById(R.id.headerTextView);
            pagerHeaderTextView.setText("Header #" + index);

            //set the pager's adapter
            UninterceptableViewPager viewPager = (UninterceptableViewPager) pagerLayout.findViewById(R.id.pager);
            TestFragmentPagerAdapter pagerAdapter = new TestFragmentPagerAdapter(this.getSupportFragmentManager(), index);
            viewPager.setAdapter(pagerAdapter);

            fragmentPagerLayout.addView(pagerLayout);
        }
    }
} 

TestFragment 的 onCreateView 和 onAttach 方法

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_layout, container, false);

    TextView titleText = (TextView) view.findViewById(R.id.titleText);
    titleText.setText(getArguments().getString("title"));

    return view;
}

public void onAttach(Activity activity) {
    super.onAttach(activity);

    Log.i("ViewPagerTest", "attached");
}

和 TestFragmentPagerAdapter 的 getItem 方法

public Fragment getItem(int position) {
    String title = titles[position];
    Log.i("ViewPagerTest", "Adapter #" + id + "--" + title);
    return TestFragment.newInstance(title, position);
}

这是视图寻呼机布局

view_pager.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/headerTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <com.example.viewpagertest.UninterceptableViewPager
        android:id="@+id/pager"
        android:layout_width="match_parent"
        android:layout_height="100dip"
        android:paddingBottom="5dip"
        android:background="@drawable/custom_shape" />

</LinearLayout>

最后,这是日志。它表明,当我在第二个视图寻呼机上滑动时,会附加一个新片段,就像第一个视图寻呼机一样。我什至检查了所有寻呼机和适配器的变量状态,但我看不出第一个寻呼机与其他寻呼机有何不同。

I/ViewPagerTest(8304): Adapter #0--title 1
I/ViewPagerTest(8304): Adapter #0--title 2
I/ViewPagerTest(8304): attached
I/ViewPagerTest(8304): attached
I/ViewPagerTest(8304): Adapter #1--title 1
I/ViewPagerTest(8304): Adapter #1--title 2
I/ViewPagerTest(8304): attached
I/ViewPagerTest(8304): attached
I/ViewPagerTest(8304): Adapter #0--title 3
I/ViewPagerTest(8304): attached
I/ViewPagerTest(8304): Adapter #1--title 3
I/ViewPagerTest(8304): attached

上面的日志仅适用于 2 个视图寻呼机,但对于任意数量的适配器,结果都是相同的。

如果我将所有视图寻呼机直接添加到 XML 而不是膨胀,它们都会毫无问题地显示。

编辑

由于我没有足够的声誉来发布屏幕截图,这就是它的样子。正如我之前提到的,第一个视图寻呼机中的片段是可见的。但是,正如您在下面看到的,它们在第二视图寻呼机中不可见,即使它们已正确连接并且我可以滑动它们。

Header #0
----------------------------
| title 1                  |
----------------------------

Header #1
----------------------------
|                          |
----------------------------
4

3 回答 3

2

您必须使用嵌套片段,将片段嵌入到父片段中。调用父片段getChildFragmentManager()而不是getFragmentManager()以获取工作的 FragmentManager。

于 2014-09-15T07:00:39.373 回答
1

尝试扩展[FragmentPagerAdapter][1]您的适配器,因为它将管理您的实例。设置适配器时特别检查此方法your_adapter.setOffscreenPageLimit(# fragments);

于 2013-05-31T07:46:28.873 回答
0

一种可能有帮助的简单解决方案。更改后再次调用 setAdapter。

viewPager.setAdapter(pagerAdapter);
于 2013-05-31T07:50:59.743 回答