例えば、次の用に XML レイアウトを使わないで ViewPager を画面に追加した場合、アプリが強制終了します。
- public class MainActivity2 extends FragmentActivity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ViewPager mViewPager = new ViewPager(this);
- setContentView(mViewPager);
- PagerAdapter mAdapter = new PagerAdapter(this);
- mViewPager.setAdapter(mAdapter);
- }
- class PagerAdapter extends FragmentPagerAdapter {
- private final Context mContext;
- public PagerAdapter(FragmentActivity activity) {
- super(activity.getSupportFragmentManager());
- mContext = activity;
- }
- @Override
- public int getCount() {
- return 5;
- }
- @Override
- public Fragment getItem(int position) {
- Bundle args = new Bundle();
- args.putInt("num", position * position);
- return Fragment.instantiate(mContext,
- SimpleFragment.class.getName(), args);
- }
- }
- }
- public class SimpleFragment extends Fragment {
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- TextView tv = new TextView(inflater.getContext());
- String message = "Message : " + getArguments().getInt("num");
- tv.setText(message);
- return tv;
- }
- }
次のように IllegalArgumentException が投げられるのですが、
04-26 20:56:16.739: E/AndroidRuntime(28770): java.lang.IllegalArgumentException: No view found for id 0xffffffff for fragment SimpleFragment{4183dd90 #0 id=0xffffffff android:switcher:-1:0}
04-26 20:56:16.739: E/AndroidRuntime(28770): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:864)
ここの部分のコードを見ると次のようになっています。
- 712 void moveToState(Fragment f, int newState, int transit, int transitionStyle) {
- 722 if (f.mState < newState) {
- 737 switch (f.mState) {
- 781 case Fragment.CREATED:
- 782 if (newState > Fragment.CREATED) {
- 784 if (!f.mFromLayout) {
- 785 ViewGroup container = null;
- 786 if (f.mContainerId != 0) {
- 787 container = (ViewGroup)mActivity.findViewById(f.mContainerId);
- 788 if (container == null && !f.mRestored) {
- 789 throw new IllegalArgumentException("No view found for id 0x"
- 790 + Integer.toHexString(f.mContainerId)
- 791 + " for fragment " + f);
- 792 }
- 793 }
これをみると、 Fragment (この場合は ViewPager の中身に Fragment のこと)がレイアウトから生成されていない場合で、Fragment の コンテナの Id が 0 でない場合に、その Id に対応する View が見つからないと上記のエラーの IllegalArgumentException が発行されることがわかります。
上記のエラーメッセージでは Fragment のコンテナの Id として 0 ではなく、0xffffffff が渡されていることがわかります。
ViewPager に明示的に Id をセットするとこのエラーはなくなります。
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ViewPager mViewPager = new ViewPager(this);
- setContentView(mViewPager);
- mViewPager.setId(100);
- PagerAdapter mAdapter = new PagerAdapter(this);
- mViewPager.setAdapter(mAdapter);
- }
ここでは適当に 100 としましたが、こうするのは良くないです。
次のように res で id を定義し、それを使います。
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <item name="viewpager" type="id"/>
- </resources>
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- ViewPager mViewPager = new ViewPager(this);
- setContentView(mViewPager);
- mViewPager.setId(R.id.viewpager);
- PagerAdapter mAdapter = new PagerAdapter(this);
- mViewPager.setAdapter(mAdapter);
- }
thank you! this solve one of my issues.
返信削除