2016-05-04 9 views
3

私はAndroidプログラミングの新機能があるので、これは[おそらく|おそらく]愚かな質問です。FragmentPagerAdapterでスワイプ中にフラグメントをスキップする

下部に4つのタブがあるiOSアプリの動作をコピーしています。

最初は、アクティブな2つは最初と最後です。センター2は、検索が成功した後にのみアクティブになります。

Androidのスワイプを変更する動作が嫌いです(iOSアプリに追加する可能性があります)。

しかし、2つの非アクティブセンターをスキップする正しい方法がわからないので、右から左へのスワイプが最初のタブから最後のタブに移動します(逆も同様です)。

公開APIにフックが表示されません。私はgetItem()で返されている項目を混乱させることができると思います(中間のものを送信するのではなく、私は最後のものにまっすぐに行きます)が、それが正しい方法であるかどうか疑問に思っています。あなたがgetItem()でインスタンスをインスタンス化するので、それはこれを行うための最良の場所ではないかもしれないことを意味するので、私は懸念しています。

これに関するご意見はありますか? Androidの場合、何かを行う方法は数多くありますが、通常は1つまたは2つの「正しい」方法しかありません。

これは正しい方法です。

+0

「位置」入力を選択するために使用されるコードはすべてオーバーライドする必要があります。私はそれがどこで行われたのか分からない。私はそれを探します。 –

+0

私はここに行く必要があることを知っていると思う。自分のクラスでViewPagerをオーバーライドする必要があります。私は現在デフォルトのクラスをインスタンス化しています。 –

+0

[この生徒](https://guide.codepath.com/android/ViewPager-with-FragmentPagerAdapter)には私が必要なものがあるようです。私は終わったときに後世の質問に答えます。 –

答えて

0

OK。私はこの問題をどのように「解決」したかを報告すると述べた。それは100%完璧ではありませんが、それは動作し、それは基本的に正しいことをしていると私は思う。

まず、the TabLayout systemを使用しました。ここでは、TabLayoutオブジェクトを作成し、ViewPagerFragmentPagerAdapterとします。

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ソリューションよりもずっと複雑ですが、うまくいくと思います。私はそれをテストし終えていません。

関連する問題