OK。私はこの問題をどのように「解決」したかを報告すると述べた。それは100%完璧ではありませんが、それは動作し、それは基本的に正しいことをしていると私は思う。
まず、the TabLayout systemを使用しました。ここでは、TabLayoutオブジェクトを作成し、ViewPagerとFragmentPagerAdapterとします。
Tab classが最終的であることがわかりました。それをサブクラス化することはできません。これは、状態(有効/無効)に対してフラグメントを使用する必要があることを意味しました。タブのクリックをオンとオフに切り替えることができますが、フラグメントサブクラスに「有効」フラグを追加しました。これは、私がタブの状態を照会するために使用するものです。
次に、アダプタサブクラスに埋め込みクラスを作成しました。私は(それはインターフェイスです)ViewPager.OnPageChangeListenerを実装:
private class MyTabPagerListener implements ViewPager.OnPageChangeListener
私はリスナーとしてTabLayoutにすることを追加します。
mViewPager.addOnPageChangeListener(new MyTabPagerListener(mTabLayout,this));
その後、私はonPageSelected()メソッドでは、 "スキップ" のコードを実装しました。選択肢がどこにあるかを予測しようとするので、適切なタブにジャンプできます。全体のアイデアは、方向を把握することです。次の選択したタブが無効になっている場合は、その後、我々は続ける:
public void onPageSelected(int position) {
AWrapperBaseFragment fragment = (AWrapperBaseFragment)mAdapter.getItem(position);
mSkipToPosition = -1; // This will inform the "wrap up" function that we need to skip to another tab.
if (!fragment.isEnabled()) {
Log.d(TAG, "Page " + position + " is disabled, selecting a different one.");
int oldPosition = mTabLayout.getSelectedTabPosition();
if (position > oldPosition) {
Log.d(TAG, "Going up.");
for (int i = position + 1; i < mAdapter.getCount(); i++) {
AWrapperBaseFragment comp_fragment = (AWrapperBaseFragment)mAdapter.getItem(i);
if (comp_fragment.isEnabled()) {
mSkipToPosition = i;
break;
}
}
}
if (mSkipToPosition == -1) {
Log.d(TAG, "Going down.");
for (int i = position - 1; i > -1; i--) {
AWrapperBaseFragment comp_fragment = (AWrapperBaseFragment)mAdapter.getItem(i);
if (comp_fragment.isEnabled()) {
mSkipToPosition = i;
break;
}
}
}
}
mSelectedPosition = position;
if (mSkipToPosition == -1) {
mSkipToPosition = mSelectedPosition;
}
Log.d(TAG, "Page selection will " + ((mSelectedPosition != mSkipToPosition) ? ("change from " + mSelectedPosition + " to " + mSkipToPosition) : "not be changed."));
}
この関数は、状態変化のコールバックで行使されるセマフォ、設定します。
public void onPageScrollStateChanged(int state) {
Log.d(TAG, "New Scroll State for page " + mSelectedPosition + ": " + state);
if ((state == 0) && (mSkipToPosition > -1) && (mSkipToPosition != mSelectedPosition)) {
Log.d(TAG, "This is a disabled page, so page selection will change from " + mSelectedPosition + " to " + mSkipToPosition + ".");
mViewPager.setCurrentItem(mSkipToPosition, true);
}
}
私が言ったように、そうではありません完璧。目立たないことがあり、無効なタブの内容が表示されていることが分かります(無効なタブには傾きを残さないでください)。
iOSソリューションよりもずっと複雑ですが、うまくいくと思います。私はそれをテストし終えていません。
「位置」入力を選択するために使用されるコードはすべてオーバーライドする必要があります。私はそれがどこで行われたのか分からない。私はそれを探します。 –
私はここに行く必要があることを知っていると思う。自分のクラスでViewPagerをオーバーライドする必要があります。私は現在デフォルトのクラスをインスタンス化しています。 –
[この生徒](https://guide.codepath.com/android/ViewPager-with-FragmentPagerAdapter)には私が必要なものがあるようです。私は終わったときに後世の質問に答えます。 –