5

나는 Android-ViewPagerIndicator을 기반으로하는 앱을 가지고 있습니다.가로 스크롤 페이지의 가로 스크롤보기

FragmentHorizontalScrollView을 만들고 싶습니다. 일부 사진이 포함됩니다. 내 문제는 내가 스크롤하려고 할 때 내 스크롤보기가 작동하지 않는다는 것입니다. 원하는 모든보기를 스크롤 할뿐 아니라 원하는보기도 스크롤 할 수 있습니다. 내 질문을 이해할 수 있기를 바랍니다! :)

는 코드의 일부이다 :

.XML

<HorizontalScrollView android:id="@+id/horizontalScroll" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:scrollbars="none" 
    android:fadingEdgeLength="10dp"> 
<LinearLayout 
     android:id="@+id/harokLayout" 
     android:background="#EEEEEE" 
     android:orientation="horizontal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

     <ImageView android:src="@drawable/app2" android:layout_height="wrap_content" android:layout_width="wrap_content" /> 
     <ImageView android:src="@drawable/app1" android:layout_height="wrap_content" android:layout_width="wrap_content" /> 
     <ImageView android:src="@drawable/app2" android:layout_height="wrap_content" android:layout_width="wrap_content" /> 
     <ImageView android:src="@drawable/app1" android:layout_height="wrap_content" android:layout_width="wrap_content" /> 
     <ImageView android:src="@drawable/app2" android:layout_height="wrap_content" android:layout_width="wrap_content" /> 
     <ImageView android:src="@drawable/app1" android:layout_height="wrap_content" android:layout_width="wrap_content" /> 
     <ImageView android:src="@drawable/app2" android:layout_height="wrap_content" android:layout_width="wrap_content" /> 
     <ImageView android:src="@drawable/app1" android:layout_height="wrap_content" android:layout_width="wrap_content" /> 
     <ImageView android:src="@drawable/app2" android:layout_height="wrap_content" android:layout_width="wrap_content" /> 
     <ImageView android:src="@drawable/app1" android:layout_height="wrap_content" android:layout_width="wrap_content" /> 
     <ImageView android:src="@drawable/app2" android:layout_height="wrap_content" android:layout_width="wrap_content" /> 
     <ImageView android:src="@drawable/app1" android:layout_height="wrap_content" android:layout_width="wrap_content" /> 

    </LinearLayout> 

</HorizontalScrollView> 

TabPageIndicator :

import android.content.Context; 
import android.support.v4.view.PagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v4.view.ViewPager.OnPageChangeListener; 
import android.util.AttributeSet; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.HorizontalScrollView; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

/** 
* This widget implements the dynamic action bar tab behavior that can change 
* across different configurations or circumstances. 
*/ 
public class TabPageIndicator extends HorizontalScrollView implements PageIndicator { 
    Runnable mTabSelector; 

    private OnClickListener mTabClickListener = new OnClickListener() { 
     public void onClick(View view) { 
      TabView tabView = (TabView)view; 
      mViewPager.setCurrentItem(tabView.getIndex()); 
     } 
    }; 

    private LinearLayout mTabLayout; 
    private ViewPager mViewPager; 
    private ViewPager.OnPageChangeListener mListener; 

    private LayoutInflater mInflater; 

    int mMaxTabWidth; 
    private int mSelectedTabIndex; 

    public TabPageIndicator(Context context) { 
     this(context, null); 
    } 

    public TabPageIndicator(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     setHorizontalScrollBarEnabled(false); 

     mInflater = LayoutInflater.from(context); 

     mTabLayout = new LinearLayout(getContext()); 
     addView(mTabLayout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.FILL_PARENT)); 
    } 

    @Override 
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     final int widthMode = MeasureSpec.getMode(widthMeasureSpec); 
     final boolean lockedExpanded = widthMode == MeasureSpec.EXACTLY; 
     setFillViewport(lockedExpanded); 

     final int childCount = mTabLayout.getChildCount(); 
     if (childCount > 1 && (widthMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.AT_MOST)) { 
      if (childCount > 2) { 
       mMaxTabWidth = (int)(MeasureSpec.getSize(widthMeasureSpec)); //edw itan * 0.4f 
      } else { 
       mMaxTabWidth = MeasureSpec.getSize(widthMeasureSpec)/2; 
      } 
     } else { 
      mMaxTabWidth = -1; 
     } 

     final int oldWidth = getMeasuredWidth(); 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     final int newWidth = getMeasuredWidth(); 

     if (lockedExpanded && oldWidth != newWidth) { 
      // Recenter the tab display if we're at a new (scrollable) size. 
      setCurrentItem(mSelectedTabIndex); 
     } 
    } 

    private void animateToTab(final int position) { 
     final View tabView = mTabLayout.getChildAt(position); 
     if (mTabSelector != null) { 
      removeCallbacks(mTabSelector); 
     } 
     mTabSelector = new Runnable() { 
      public void run() { 
       final int scrollPos = tabView.getLeft() - (getWidth() - tabView.getWidth())/2; 
       smoothScrollTo(scrollPos, 0); 
       mTabSelector = null; 
      } 
     }; 
     post(mTabSelector); 
    } 

    @Override 
    public void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     if (mTabSelector != null) { 
      // Re-post the selector we saved 
      post(mTabSelector);  
     } 
    } 

    @Override 
    public void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     if (mTabSelector != null) { 
      removeCallbacks(mTabSelector); 
     } 
    } 

    private void addTab(String text, int index) { 
     //Workaround for not being able to pass a defStyle on pre-3.0 
     final TabView tabView = (TabView)mInflater.inflate(R.layout.vpi__tab, null); 
     tabView.init(this, text, index); 
     tabView.setFocusable(true); 
     tabView.setOnClickListener(mTabClickListener); 

     mTabLayout.addView(tabView, new LinearLayout.LayoutParams(0, LayoutParams.FILL_PARENT, 1)); 
    } 

    @Override 
    public void onPageScrollStateChanged(int arg0) { 
     if (mListener != null) { 
      mListener.onPageScrollStateChanged(arg0); 
     } 
    } 

    @Override 
    public void onPageScrolled(int arg0, float arg1, int arg2) { 
     if (mListener != null) { 
      mListener.onPageScrolled(arg0, arg1, arg2); 
     } 
    } 

    @Override 
    public void onPageSelected(int arg0) { 
     setCurrentItem(arg0); 
     if (mListener != null) { 
      mListener.onPageSelected(arg0); 
     } 
    } 

    @Override 
    public void setViewPager(ViewPager view) { 
     final PagerAdapter adapter = view.getAdapter(); 
     if (adapter == null) { 
      throw new IllegalStateException("ViewPager does not have adapter instance."); 
     } 
     if (!(adapter instanceof TitleProvider)) { 
      throw new IllegalStateException("ViewPager adapter must implement TitleProvider to be used with TitlePageIndicator."); 
     } 
     mViewPager = view; 
     view.setOnPageChangeListener(this); 
     notifyDataSetChanged(); 
    } 

    public void notifyDataSetChanged() { 
     mTabLayout.removeAllViews(); 
     TitleProvider adapter = (TitleProvider)mViewPager.getAdapter(); 
     final int count = ((PagerAdapter)adapter).getCount(); 
     for (int i = 0; i < count; i++) { 
      addTab(adapter.getTitle(i), i); 
     } 
     if (mSelectedTabIndex > count) { 
      mSelectedTabIndex = count - 1; 
     } 
     setCurrentItem(mSelectedTabIndex); 
     requestLayout(); 
    } 

    @Override 
    public void setViewPager(ViewPager view, int initialPosition) { 
     setViewPager(view); 
     setCurrentItem(initialPosition); 
    } 

    @Override 
    public void setCurrentItem(int item) { 
     if (mViewPager == null) { 
      throw new IllegalStateException("ViewPager has not been bound."); 
     } 
     mSelectedTabIndex = item; 
     final int tabCount = mTabLayout.getChildCount(); 
     for (int i = 0; i < tabCount; i++) { 
      final View child = mTabLayout.getChildAt(i); 
      final boolean isSelected = (i == item); 
      child.setSelected(isSelected); 
      if (isSelected) { 
       animateToTab(item); 
      } 
     } 
    } 

    @Override 
    public void setOnPageChangeListener(OnPageChangeListener listener) { 
     mListener = listener; 
    } 

    public static class TabView extends LinearLayout { 
     private TabPageIndicator mParent; 
     private int mIndex; 

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

     public void init(TabPageIndicator parent, String text, int index) { 
      mParent = parent; 
      mIndex = index; 

      TextView textView = (TextView)findViewById(android.R.id.text1); 
      textView.setText(text); 
     } 

     @Override 
     public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
      super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

      // Re-measure if we went beyond our maximum size. 
      if (mParent.mMaxTabWidth > 0 && getMeasuredWidth() > mParent.mMaxTabWidth) { 
       super.onMeasure(MeasureSpec.makeMeasureSpec(mParent.mMaxTabWidth, MeasureSpec.EXACTLY), 
         heightMeasureSpec); 
      } 
     } 

     public int getIndex() { 
      return mIndex; 
     } 
    } 
} 

FragmentPagerAdapter2 :

import java.util.List; 

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 

class FragmentPagerAdapter2 extends FragmentPagerAdapter implements TitleProvider { 

    private final List<Fragment> fragments; 

    /** 
    * @param fm 
    * @param fragments 
    */ 
    public FragmentPagerAdapter2(FragmentManager fm, List<Fragment> fragments) { 
     super(fm); 
     this.fragments = fragments; 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see android.support.v4.app.FragmentPagerAdapter#getItem(int) 
    */ 
    @Override 
    public Fragment getItem(int position) { 
     return this.fragments.get(position); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see android.support.v4.view.PagerAdapter#getCount() 
    */ 
    @Override 
    public int getCount() { 
     return this.fragments.size(); 
    } 

    public String getTitle(int position) { 
     return MarketAppActivity.CONTENT[position % MarketAppActivity.CONTENT.length].toUpperCase(); 
    } 
} 
+0

내가 여기에 비슷한 발견하지만 난 그것을 work..http 얻을 수 없습니다 //stackoverflow.com/questions/6920137/android-viewpager-and-horizontalscrollview –

+0

당신이 문제를 해결 있나요? – hendrix

답변

1

HorizontalScrollView의 사용자 정의 하위 클래스를 만들고 onTouchEvent를 수정하여 가로 스 와이프가 감지 된 경우 프래그먼트에서 터치 이벤트를 가로 채야합니다. 예를 들어

:

public class CustomHorizontalScrollView extends HorizontalScrollView { 

    ... 

    public void setParent(ViewPager parentView) { 
     mParentView = parentView; 
    } 

    @Override 
    public synchronized boolean onTouchEvent(MotionEvent event) { 
     if ((event.getAction() == MotionEvent.ACTION_DOWN) && 
      (mParentView != null)) { 
      mParentView.requestDisallowInterceptTouchEvent(true); 
     } 

     return super.onTouchEvent(event); 
    } 

    ... 

} 

mParentView 물론 조각에 부착되는 ViewPager에 대한 참조이다. 이 방법으로 특정 모션 이벤트 (ACTION_MOVE 및 ACTION_UP)와 연관된 모든 추가 동작은 ViewPager를 우회하여 자식 HorizontalScrollView에 주어집니다.

0

조각 내에서 ViewPager를 사용 해본 적이 있습니까? 그것은 수평 스크롤/스 와이프가 진행되는 한 당신이가는 것처럼 보이지만 그것은 다리 작업이 적습니다. 기본적으로 활동의 뷰 페이지에 조각/단편 레이아웃 목록을 제공하고 평소처럼 PageAdapter를 설정합니다. 레이아웃을 재사용하거나 호출기의 각 페이지마다 다른 레이아웃을 만들 수 있습니다. 이 블로그 게시물을 좀 더 명확하게 확인할 수 있습니다.

http://thepseudocoder.wordpress.com/2011/10/05/android-page-swiping-using-viewpager/