web-dev-qa-db-ja.com

FragmentPagerAdapterスワイプしてListView1 / 3画面幅を表示

編集:以下の私の答えを参照してください->

右にスワイプするとlistViewが表示されるビューが欲しいのですが。新しいGooglePlayストアに実装されているものと非常によく似ています(下のサンプル画像)。 ViewPagerだと思いますが、勝てずに複製してみました。 'listView Page' width属性が特定のdpに設定されているだけかもしれないと思っていましたが、それは機能しません。私も変更しようとしました pakerfeldtのviewFlow そしてGoogleがこれをどのように行うのか理解できません

私は正しい方向に進んでいますか?誰かがこれを複製する方法を考えているなら、私はそれを大いに感謝します。これは、タブレットでナビゲーションビューを表示するための人気のある新しい方法になるかもしれないと思います。コードが最も役に立ちます。ありがとうございました!!

enter image description here

右にスワイプ:

enter image description here

完成したスワイプ。レイアウトにはリストと2番目のフラグメントの一部(正確に表示されているとおり)リストフラグメントが画面全体に表示されません。

enter image description here

ユーザーが左にスワイプすると、メインページのみが表示され、ユーザーがもう一度左にスワイプすると、viewPagerは次のページに進みます。

20
user742030

更新が遅れてすみません。私は これはGethubのwalkingiceから ほとんど変更せずに実装しました。 GestureDetectorの条件ステートメントを使用して、ViewPageridが「0」の場合にのみビューにスワイプします。 ActionBarにトグルも追加しました

1
user742030

次のコードは、目的の効果を実現します。

PageAdapterで:

@Override
public float getPageWidth(int position) {
if (position == 0) {
    return(0.5f);
} else {
    return (1.0f);       
}
20
bludef

最後にもう一度質問を読んでください...サイズのデバイスごとに特定のレイアウトも設定してください。スクリーンショットでは、これをタブレットで実行しようとしているように見えます。電話でも同じ結果が得られますか?

レイアウトの設定

レイアウトがこれと類似していて、ViewPagerがあることを確認してください。

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
          Android:orientation="vertical"
          Android:layout_width="fill_parent"
          Android:layout_height="fill_parent"
          Android:background="@color/body_background">

<include layout="@layout/pagerbar" />
<include layout="@layout/colorstrip" />

<Android.support.v4.view.ViewPager
        Android:id="@+id/example_pager"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:layout_weight="1" />

</LinearLayout>

アクティビティの設定

「FragmentActivity」でPagerAdapterを設定し、「OnPageChangeListener」を実装していることを確認してください。次に、onCreateでPagerAdapterを適切に設定します。

public class Activity extends FragmentActivity 
             implements ViewPager.OnPageChangeListener { 
   ...

    public void onCreate(Bundle savedInstanceState) {

       PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager());
       pager = (ViewPager) findViewById(R.id.example_pager);

       pager.setAdapter(adapter);
       pager.setOnPageChangeListener(this);
       pager.setCurrentItem(MyFragment.PAGE_LEFT);

       ...
   }


   /* setup your PagerAdapter which extends FragmentPagerAdapter */

   static class PagerAdapter extends FragmentPagerAdapter {
       public static final int NUM_PAGES = 2;

       private MyFragment[] mFragments = new MyFragment[NUM_PAGES];

          public PagerAdapter(FragmentManager fragmentManager) {
           super(fragmentManager);
       }

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

       @Override
       public Fragment getItem(int position) {
           if (mFragments[position] == null) {
               /* this calls the newInstance from when you setup the ListFragment */
               mFragments[position] = MyFragment.newInstance(position);
           }

           return mFragments[position];
       }
   }

 ...

フラグメントの設定

実際のListFragment(listViews)を設定すると、次のような引数を使用して複数のインスタンスを作成できます。

  public static final int PAGE_LEFT = 0;
  public static final int PAGE_RIGHT = 1;

  static MyFragment newInstance(int num) {
       MyFragment fragment = new MyFragment();

       Bundle args = new Bundle();
       args.putInt("num", num);

       fragment.setArguments(args);
       return fragment;
   }

ListViewsをリロードすると(これを実装することにした場合でも)、次のような引数を使用して、どのフラグメントインスタンスを使用しているかを把握できます。

    mNum = getArguments() != null ? getArguments().getInt("num") : 1;

コードをステップスルーすると、各インスタンスがステップスルーするため、上記のコードはonCreateでのみ必要であり、リロードメソッドは次のようになります。このような:

private void reloadFromArguments() {
    /* mNum is a variable which was created for each instance in the onCreate */
    switch (mNum) {
        case PAGE_LEFT:
            /* maybe a query here would fit your needs? */
            break;

        case PAGE_RIGHT:
            /* maybe a query here would fit your needs? */
            break;
    }
}

ゼロから始めるのではなく、最初から構築できる例で役立つ可能性のあるいくつかのソース:

遊び場からのより多くの説明と例。 http://blog.peterkuterna.net/2011/09/viewpager-meets-swipey-tabs.html これは参照先です: http://code.google.com/p/Android-playground /

より多くの情報といくつかの良いつながり。 http://www.pushing-pixels.org/2012/03/16/sensitive-mobile-design-on-Android-from-view-pager-to-action-bar-tabs.html

より具体的な質問の投稿があり、私はいつでも私の回答を編集(更新)してあなたの質問に対処することができます。幸運を! :)

2
Codeversed

ViewPager互換性のあるパッケージ の一部です

Fragments を使用している場合は、ViewPagerを使用してそれらの間をスワイプできます。

ここに例がありますFragmentsViewPagerを組み合わせる

特定のケースでは、ListFragmentを作成してから、ViewPagerを実装する必要があります。

0
adneal

少しトリックを加えるだけで、ViewPager内のScrollView-Behaviorを使用して動作を実現できます。一番左のフラグメントの領域のみを制限したい場合は、ScrollViewのスクロール制限を制限できます。

あなたの場合:ViewPagerのonPageChangeListenerで、次のようなことを行います。

@Override
public void onPageScrollStateChanged(int arg0) {
    restrictLeftScroll();
}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
    restrictLeftScroll();
}

@Override
public void onPageSelected(int arg0) {

}

private void restrictLeftScroll() {

    if (display != null) {

        /* get display size */
        Point size = new Point();
        display.getSize(size);

        /* get desired Width of left fragment */
        int fragmentWidth = getResources().getDimensionPixelSize(R.dimen.category_fragment_width);

        if (mViewPager.getScrollX() < size.x - fragmentWidth) {
            mViewPager.scrollTo(size.x - fragmentWidth, mViewPager.getScrollY());
        }
    }
}

このコードは問題なく機能しました。 ;)

0
Neonfly

標準の横に「サイドナビゲーション」を実装しようとしていると思います ViewPager

私はこのパターンに関する2つの異なる記事を読みました:

パターン自体の最初のもの:

Android Uiパターンの新しいUIパターン-サイドナビゲーション

誰がそれを構築するかについてのより詳細な方法に関する2番目:

Cyril Mottierフライインアプリメニュー #1#2

この2番目の記事は、Android UiPatternブログで参照されています。

0
ol_v_er