8

次の画面をデザインする必要があり、アドバイスが必要です。

ここに画像の説明を入力

説明:

タイトルは静的/固定であり、何もする必要はありません。

黄色:これは興味深い部分ViewPagerです。最大 4 つの画面を左右にスクロールできるような画面を設計する必要があります。

赤:すべての画面で、画面サイズに合わない場合にスクロール可能なテーブル/グリッドを追加する必要があります。

緑色:ページの切り替えは、画面下部の緑色のボタンを使用するか、 をスクロールして行うことができますViewPager

問題は次のとおりです。この動作は を使用して実現できViewPagerますFragmentsか? Fragment が適している場合、スライド ジェスチャを使用してページ切り替えを実装するにはどうすればよいでしょうか。場合ViewPagerは、内側のスクロールを追加する方法と、下部のボタンを使用してそれを制御する方法は?

助けていただければ幸いです、ありがとう。

4

2 に答える 2

7

これはNon Swipeable で取り組むべきだと思いますViewPager。ビュー ページャーその下にあるFragments がスワイプ ジェスチャに応答する方法はありません。でのスワイプを無効にするためにオーバーライドするメソッドは次のViewPagerとおりです。

  1. onTouchEvent()- 戻りますfalse
  2. onInterceptTouchEvent()- 戻りますfalse

これを達成する方法の詳細については、この SO の質問を参照してください。

Fragment次に、各ページャー ホルダー内で sを使用したいと考えています。したがって、次のレイアウトを構築しています。

親アクティビティ内でFragmentPagerAdapterインスタンス化され、タブにタグが追加されます。

アクティビティの変更

@Override
protected void onCreate(final Bundle saveInstanceState) {
    final FragmentPagerAdapter myTabAdapter = new MyFragmentPagerAdapter(
            <Your ViewPager View>, <Your activity context, this>);
    myTabAdapter.addTab(getActionBar().newTab(), "YOUR TAG", "Your Title");
    // etc...
}

これにより、上の図のフレームが得られます。ViewPagerおよびその下にあるタブを含むホスティング アクティビティ。次は、Fragment(テーブルを含む) をそれぞれのタブに入れることです。これはFragmentPagerAdapter実装によって処理されます。

フラグメント アダプター (内部クラスからアクティビティへ):

private class MyFragmentPagerAdapter extends FragmentPagerAdapter implements
        ActionBar.TabListener, ViewPager.OnPageChangeListener {

    /**
     * Constructs a pager adapter to back a {@link ViewPager}.
     * 
     * @param pager
     *            The {@link ViewPager} widget.
     * @param activityContext
     *            The context the widget is being added under.
     */
    public SpotMenuFragmentPagerAdapter(final ViewPager pager,
            final Context activityContext) {
        super(getFragmentManager());
        pager.setAdapter(this);
        this.context = activityContext;
    }

    /**
     * Adds a tab to the hosting activity action bar.
     * 
     * @param newTab
     *            The tab to add.
     * @param tag
     *            The tab tag for id purposes.
     * @param label
     *            The label of the tab displayed to the user.
     */
    public void addTab(final ActionBar.Tab newTab, final String tag,
            final String label) {
        newTab.setTag(tag);
        newTab.setText(label);
        newTab.setTabListener(this);
        getSupportActionBar().addTab(newTab);
    }

    /**
     * This is where you do the work of building the correct fragment based
     * on the tab currently selected.
     * 
     * @see FragmentPagerAdapter#getItem(int)
     */
    @Override
    public Fragment getItem(final int position) {
        final Tab tab = getActionBar().getTabAt(position);
        if ("MY TAG".equals(tab.getTag().toString()) {
            // instantiate the fragment (table) for "MY TAG"
        } else {
            // instantiate something else...
        }
    }

    /**
     * One fragment per tab.
     * 
     * @see android.support.v4.view.PagerAdapter#getCount()
     */
    @Override
    public int getCount() {
        return getSupportActionBar().getTabCount();
    }

    /**
     * @see ViewPager.OnPageChangeListener#onPageScrollStateChanged(int)
     */
    @Override
    public void onPageScrollStateChanged(final int arg0) {
        // No-op.
    }

    /**
     * @see ViewPager.OnPageChangeListener#onPageScrolled(int, float, int)
     */
    @Override
    public void onPageScrolled(final int arg0, final float arg1,
            final int arg2) {
        // No-op.
    }

    /**
     * @see ViewPager.OnPageChangeListener#onPageSelected(int)
     */
    @Override
    public void onPageSelected(final int position) {
        getSupportActionBar().setSelectedNavigationItem(position);
    }

    /**
     * @see TabListener#onTabSelected(app.ActionBar.Tab,
     *      app.FragmentTransaction)
     */
    @Override
    public void onTabSelected(final Tab tab, final FragmentTransaction ft) {
        viewPager.setCurrentItem(tab.getPosition());
    }

    /**
     * @see TabListener#onTabUnselected(ActionBar.Tab,
     *      app.FragmentTransaction)
     */
    @Override
    public void onTabUnselected(final Tab tab, final FragmentTransaction ft) {
        // No-op.
    }

    /**
     * @see TabListener#onTabReselected(ActionBar.Tab,app.FragmentTransaction)
     */
    @Override
    public void onTabReselected(final Tab tab, final FragmentTransaction ft) {
        // No-op.
    }
}

したがって、この時点で、「スワイプ不可」のビュー ページャーをホストするアクティビティと、タイトルの下 (または画面サイズによっては横) のタブ バーの形式でタブを切り替えるメカニズムができていることを願っています。この時点から、タブ バーをいくつかのナビゲーション矢印に置き換えるようにカスタマイズできると確信しています。

注:その多くは記憶に基づいて書かれていますが、うまくいけば、これでどこに行くかの要点を伝えました.

アップデート

更新された質問への回答: タブを任意の古いビューに設定できます。それに応じてTabSpecを設定します。申し訳ありませんが、私はこれを自分で使用していません。

于 2013-03-18T20:02:53.853 に答える