2013-03-22 14 views
6

私はfragmentPagerAdapter viewpagerの中にいくつかのフラグメントクラスを持っています。したがって、このviewpagerはスワイプで左右にスクロールします。問題は、各ページでは値がページサイズを超えているため、それらをすべて表示するには縦方向にスクロールする必要があるということです。しかし、私は垂直スクロールを有効にすることはできません。私は自分が持っていたすべてのコードを取り除き、コードを稼働状態にしました。 (私は、Androidアプリストアのような何かをしたい:カテゴリの水平スクロールおよび垂直方向のアプリを見るために。)ここでビューページの縦スクロール

が私のコードです:

MyFragmentPagerAdapter:必要

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

     <android.support.v4.view.ViewPager 
      android:id="@+id/pager" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:isScrollContainer="true"> 

      <android.support.v4.view.PagerTitleStrip 
       android:id="@+id/pager_title_strip" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_gravity="top" 
       android:background="#33b5e5" 
       android:paddingBottom="4dp" 
       android:paddingTop="4dp" 
       android:textColor="#fff" /> 
     </android.support.v4.view.ViewPager> 
</RelativeLayout> 

フラグメント活動垂直スクロール:ここ

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginLeft="30dp" 
     android:layout_marginTop="10dp" 
     android:text="Last fill-up spent :" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/textView2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/textView1" 
     android:layout_below="@+id/textView1" 
     android:layout_marginTop="15dp" 
     android:text="Month total spent :" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/currentMoneySpentText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/textView2" 
     android:layout_marginLeft="24dp" 
     android:layout_toRightOf="@+id/textView1" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/monthTotalSpentText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/textView2" 
     android:layout_alignLeft="@+id/currentMoneySpentText" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/textView3" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/textView2" 
     android:layout_below="@+id/textView2" 
     android:layout_marginTop="15dp" 
     android:text="Year total spent :" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/textView4" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/textView3" 
     android:layout_below="@+id/textView3" 
     android:layout_marginTop="15dp" 
     android:text="Since 1st addition :" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/yearTotalSpentText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/textView4" 
     android:layout_alignLeft="@+id/monthTotalSpentText" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/firstTotalSpentText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/textView4" 
     android:layout_alignLeft="@+id/yearTotalSpentText" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/textView7" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/textView6" 
     android:layout_below="@+id/textView6" 
     android:layout_marginTop="1dp" 
     android:text="since last addition :" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/textView8" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/textView7" 
     android:layout_below="@+id/textView7" 
     android:layout_marginTop="15dp" 
     android:text="Distance covered" 
     android:textSize="15dp" /> 
</RelativeLayout> 

は関連している私のフラグメントクラスの最初の数行は、以下のとおりです。

public class MyFragmentDetails extends Fragment { 

private RelativeLayout ll; 
private FragmentActivity fa; 
DBAdapter db; 

// MyFragmentFuel fFuels; 
private String carSelected, m, y, lowestDistance, highestDistance; 

BroadcastReceiver receiver; 
int highestDay = 0; 
int lowestDay = 31; 

public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
} 

@SuppressWarnings("static-access") 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    fa = super.getActivity(); 
    super.onCreate(savedInstanceState); 
    ll = (RelativeLayout) inflater.inflate(
      R.layout.activity_add_fuel_details, container, false); 
+0

http://stackoverflow.com/questions/8381697/を置きますviewpager-inside-a-scrollview-does-not-scroll-correcltyこれを試してみましたか? – dmnlk

+0

iveこのコードを見たが、私はどこでそれを使うべきか分からない。 –

+0

あなたは、MyFragmentPagerAdapterレイアウトをinflateするFragmentクラスのonStart()メソッドでこれらのコードを使用します。 – dmnlk

答えて

0

内容をNestedScrollViewにラップしてみてください。スクロールがまだ(それは私の場合ではありませんでした)動作しない場合は、垂直方向にスクロールしている場合は、その親にrequestDIsallowInterceptTouchEvent(true)を呼び出しOnTouchListenerを追加してみてください:その後

scrollView.setOnTouchListener(new View.OnTouchListener() { 
     int dragthreshold = 30; 
     int downX = 0; 
     int downY = 0; 

     @Override 
     public boolean onTouch(View view, MotionEvent event) { 
      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        downX = (int) event.getRawX(); 
        downY = (int) event.getRawY(); 
        break; 

       case MotionEvent.ACTION_MOVE: 
        int distanceX = Math.abs((int) event.getRawX() - downX); 
        int distanceY = Math.abs((int) event.getRawY() - downY); 

        if (distanceY > distanceX) { 
         view.getParent().requestDisallowInterceptTouchEvent(true); 
        } else if (distanceX > distanceY && distanceX > dragthreshold) { 
         view.getParent().requestDisallowInterceptTouchEvent(false); 
        } 
        break; 

       case MotionEvent.ACTION_UP: 
        view.getParent().requestDisallowInterceptTouchEvent(false); 
        break; 
      } 
      return false; 
     } 
    }); 
1
Try putting your content in scroll view like this: 

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 
<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginLeft="30dp" 
     android:layout_marginTop="10dp" 
     android:text="Last fill-up spent :" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/textView2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/textView1" 
     android:layout_below="@+id/textView1" 
     android:layout_marginTop="15dp" 
     android:text="Month total spent :" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/currentMoneySpentText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/textView2" 
     android:layout_marginLeft="24dp" 
     android:layout_toRightOf="@+id/textView1" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/monthTotalSpentText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/textView2" 
     android:layout_alignLeft="@+id/currentMoneySpentText" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/textView3" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/textView2" 
     android:layout_below="@+id/textView2" 
     android:layout_marginTop="15dp" 
     android:text="Year total spent :" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/textView4" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/textView3" 
     android:layout_below="@+id/textView3" 
     android:layout_marginTop="15dp" 
     android:text="Since 1st addition :" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/yearTotalSpentText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/textView4" 
     android:layout_alignLeft="@+id/monthTotalSpentText" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/firstTotalSpentText" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/textView4" 
     android:layout_alignLeft="@+id/yearTotalSpentText" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/textView7" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/textView6" 
     android:layout_below="@+id/textView6" 
     android:layout_marginTop="1dp" 
     android:text="since last addition :" 
     android:textSize="15dp" /> 

    <TextView 
     android:id="@+id/textView8" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignLeft="@+id/textView7" 
     android:layout_below="@+id/textView7" 
     android:layout_marginTop="15dp" 
     android:text="Distance covered" 
     android:textSize="15dp" /> 
</LinearLayout> 
</ScrollView> 

したい場合はあなたのスクロール上の任意の特定のイベントを行うために、次に使用します。

これは、上記適用アンドロイドバージョンのマシュマロとは、次のとおりです。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       mScrollView.setOnScrollChangeListener(new View.OnScrollChangeListener() { 
        @Override 
        public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { 
         if (view.getTop() == scrollY) { 
          Log.e(TAG, "onScrollChange: top"); 
         } else { 

         } 
        } 
       }); 
      } 

下のバージョンで使用することができます:

final ViewTreeObserver.OnScrollChangedListener onScrollChangedListener = new 
        ViewTreeObserver.OnScrollChangedListener() { 

         @Override 
         public void onScrollChanged() { 
          int scrollY = mScrollView.getScrollY(); // For ScrollView 
          int scrollX = mScrollView.getScrollX(); // For HorizontalScrollView 
          // DO SOMETHING WITH THE SCROLL COORDINATES 
          if (view.getTop() == scrollY) { 

           Log.e(TAG, "ViewTreeObserver onScrollChange: top"); 
          } 
         } 
        }; 
      mScrollView.setOnTouchListener(new View.OnTouchListener() { 
       private ViewTreeObserver observer; 

       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        if (observer == null) { 
         observer = mScrollView.getViewTreeObserver(); 
         observer.addOnScrollChangedListener(onScrollChangedListener); 
        } 
        else if (!observer.isAlive()) { 
         observer.removeOnScrollChangedListener(onScrollChangedListener); 
         observer = mScrollView.getViewTreeObserver(); 
         observer.addOnScrollChangedListener(onScrollChangedListener); 
        } 

        return false; 
       } 
      }); 
+0

ScrollViewは複数の直接的な子供を受け入れません! – Sadegh

+0

ええ、私は編集で子供を見逃した –

0

プロジェクト内のクラスを作成し、このXMLコールで

public class VerticalViewPager extends ViewPager { 

public VerticalViewPager(Context context) { 
    super(context); 
    init(); 
} 

public VerticalViewPager(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(); 
} 

private void init() { 
    // The majority of the magic happens here 
    setPageTransformer(true, new VerticalPageTransformer()); 
    // The easiest way to get rid of the overscroll drawing that happens on the left and right 
    setOverScrollMode(OVER_SCROLL_NEVER); 
} 

private class VerticalPageTransformer implements ViewPager.PageTransformer { 

    @Override 
    public void transformPage(View view, float position) { 

     if (position < -1) { // [-Infinity,-1) 
      // This page is way off-screen to the left. 
      view.setAlpha(0); 

     } else if (position <= 1) { // [-1,1] 
      view.setAlpha(1); 

      // Counteract the default slide transition 
      view.setTranslationX(view.getWidth() * -position); 

      //set Y position to swipe in from top 
      float yPosition = position * view.getHeight(); 
      view.setTranslationY(yPosition); 

     } else { // (1,+Infinity] 
      // This page is way off-screen to the right. 
      view.setAlpha(0); 
     } 
    } 
} 

/** 
* Swaps the X and Y coordinates of your touch event. 
*/ 
private MotionEvent swapXY(MotionEvent ev) { 
    float width = getWidth(); 
    float height = getHeight(); 

    float newX = (ev.getY()/height) * width; 
    float newY = (ev.getX()/width) * height; 

    ev.setLocation(newX, newY); 

    return ev; 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev){ 
    boolean intercepted = super.onInterceptTouchEvent(swapXY(ev)); 
    swapXY(ev); // return touch coordinates to original reference frame for any child views 
    return intercepted; 
} 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    return super.onTouchEvent(swapXY(ev)); 
} 

}

このクラスの代わりに、android.support.v4.view.ViewPager

関連する問題