20

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

右にスワイプするとlistViewが表示されるビューが欲しいです。新しい Google Play ストアで実装されているものと非常によく似ています (下のサンプル画像)。ViewPagerだと思いますが、優先せずに複製してみました。「listViewページ」の幅属性が特定のdpに設定されているだけかもしれないと思っていましたが、うまくいきません。また、 pakerfeldt の viewFlowを変更しようとしましたが、Google がこれをどのように行っているかわかりません

私は正しい軌道に乗っていますか?誰かがこれを複製する方法を知っているなら、私はそれを大いに感謝します. これは、タブレットでナビゲーション ビューを表示する新しい方法として一般的になる可能性があると思います....? コードが最も役立ちます。ありがとうございました!!

ここに画像の説明を入力

右にスワイプ:

ここに画像の説明を入力

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

ここに画像の説明を入力

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

4

6 に答える 6

20

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

PageAdapter

@Override
public float getPageWidth(int position) {
if (position == 0) {
    return(0.5f);
} else {
    return (1.0f);       
}
于 2012-09-20T21:00:08.723 に答える
2

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

レイアウトの設定

レイアウトがこれに似ていることと、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でのみ必要であり、reload メソッドは次のようになります。

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/responsive-mobile-design-on-android-from-view-pager-to-action-bar-tabs.html

より具体的な質問が投稿された場​​合は、いつでも回答を編集 (更新) して質問に対処できます。幸運を!:)

于 2012-04-10T02:22:12.640 に答える
1

更新が遅くなり申し訳ありません。私は Gethub の walkice からこれをほとんど変更せずに実装しました。「0」の ViewPager id が表示されている場合にのみ、GestureDetector の条件ステートメントを使用してビューにスワイプします。また、ActionBar 内にトグルを追加しました

于 2012-06-12T13:50:51.953 に答える
0

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

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

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

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

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

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

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

于 2012-06-12T13:29:42.757 に答える
0

ちょっとしたトリックで、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());
        }
    }
}

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

于 2012-06-22T09:37:45.503 に答える
0

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

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

Fragmentsとを組み合わせた例です。ViewPager

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

于 2012-03-14T00:24:05.940 に答える