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
----------------------------
| |
----------------------------