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>

最後にログです。2 番目のビュー ページャーをスワイプすると、1 番目のビュー ページャーと同じように新しいフラグメントが追加されることがわかります。すべてのページャーとアダプターの変数の状態もチェックしましたが、最初のページャーが他のページャーとどう違うのかわかりません。

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 に追加すると、それらはすべて問題なく表示されます。

編集

スクリーンショットを投稿するほどの評判はありませんので、以下のように表示されます。前述したように、最初のビュー ページャーのフラグメントが表示されます。ただし、以下に示すように、正しく接続されているにもかかわらず、2 番目のビュー ページャーには表示されず、スワイプできます。

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

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

3 に答える 3

0

役立つかもしれない1つの簡単な解決策。変更後、setAdapter を再度呼び出します。

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