0

ViewPager を FragmentPagerAdapter ですべての動的 GUI 要素 (つまり、XML なし) で使用しようとしています。はい、私はそれが好きだからではなく、正当な理由があります:)これが機能しないことを示唆するドキュメントが見つかりません。

機能する場合と機能しない場合の唯一の違いは、ViewGroup (LinearLayout) と ViewPager を onCreate() で作成するのではなく、XML で定義することです。次のエラーが発生します。

java.lang.IllegalArgumentException: No view found for id 0xffffffff for fragment PageFragment{41936480 #0 id=0xffffffff android:switcher:-1:0}

コード:

public class DynoPagerActivity extends FragmentActivity {

  private static class MyFragmentPagerAdapter extends FragmentPagerAdapter {

    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int index) {
        return PageFragment.newInstance("My Message " + index);
    }

    @Override
    public int getCount() {
        return 4;
    }
  }

  private ViewPager mViewPager;
  private MyFragmentPagerAdapter mMyFragmentPagerAdapter;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LinearLayout ll = new LinearLayout(this);
    ll.setOrientation(LinearLayout.VERTICAL);
    setContentView(ll);

    mViewPager = new ViewPager(this);
    mMyFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
    mViewPager.setAdapter(mMyFragmentPagerAdapter);
    ll.addView(mViewPager);
    //setContentView(ll);  tried here as well...
  }
}

と:

public class PageFragment extends Fragment {

public static PageFragment newInstance(String title) {

    PageFragment pageFragment = new PageFragment();
    Bundle bundle = new Bundle();
    bundle.putString("title", title);
    pageFragment.setArguments(bundle);
    return pageFragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    // https://android-review.googlesource.com/#/c/31261/  - bug in Support lib
    setUserVisibleHint(true);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    TextView textView = new TextView(container.getContext());
    textView.setText(getArguments().getString("title"));
    return textView;
}
}

フラグメントが作成される方法/タイミングに問題があるようですが、接続が見つかりません...

4

1 に答える 1

3

ViewPager は、親 (ViewPager ID) を取得しようとする「ページ」ごとに findViewById() を呼び出しますが、ID が設定されていないビューでは常に失敗します。プログラムでビューを作成すると、ID は -1 になります。これは、Android プラットフォームのソース コードを参照した後、findViewByID() に対して常に null/fail を返します。

ID を追加すると機能しますが、問題を回避するために ID を自分で安全に管理する必要があります。これを上記のコードに追加して、onCreate() メソッドで機能させます。

mViewPager.setId(888889);
于 2012-09-27T15:25:53.917 に答える