2017-05-31 77 views
0

我已經實現了一個ViewPager在片段之間滑動。問題是我想禁用分頁,直到滿足某些條件。我在下面展示的代碼幾乎可以正常工作,但它不允許在片段佈局中進行垂直滾動,我只想禁用水平滾動,即我的意思是片段之間的轉換。禁用片段中的水平滾動

我有包含自定義ViewPager如下的佈局:

layout_pager

<LinearLayout 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:orientation="vertical" tools:context=".MyActivity"> 

    <mypackage.CustomViewPager android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 
</LinearLayout> 

和另一個佈局以定義片段的它實現了一個滾動型含量:

layout_fragment

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MyActivity"> 

    <LinearLayout> 
     <!-- Some TextViews, Images, Buttons, etc --> 
    </LinearLayout> 
</ScrollView> 

活性剛剛分配適配器

MyActivity

public class MyActivity extends AppCompatActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.layout_pager); 
     CustomViewPager viewPager = (CusotmViewPager) findViewById(R.id.viewpager); 

     CustomAdapter adapter = new CustomAdapter(getSupportFragmentManager()); 
     viewPager.setAdapter(adapter); 
    } 
} 

的CustomViewPager有一個標誌,以指示是否允許分頁

CustomViewPager

public class CustomViewPager extends ViewPager { 

    private boolean enabled; 

    public CustomViewPager(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     enabled = true; 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     return enabled ? super.onInterceptTouchEvent(ev) : false; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     return enabled ? super.onTouchEvent(event) : false; 
    } 

    public void setPagingEnabled(boolean enabled) { 
     this.enabled = enabled; 
    } 
} 

最後,片段截取觸摸事件以檢查條件是否滿足以啓用頁碼。

MyFragment

public class MyFragment extends Fragment { 

    public MyFragment() {} 

    @Override 
    public View onCreateView(final LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.layout_fragment, container, false); 
     final MyActivity myActivity = (MyActivity) getActivity(); 

     rootView.setOnTouchListener(new View.OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_DOWN) { 
        View customViewPagerRoot = myActivity.findViewById(R.id.viewpager); 
        CustomViewPager viewPager = (CustomViewPager) customViewPagerRoot.findViewById(R.id.viewpager); 
        if (condition to allow the pagination) { 
         viewPager.setPagingEnabled(true); 
        } else { 
         viewPager.setPagingEnabled(false); 
        } 
       } 

       return true; 
      } 
     }); 

     return rootView; 
    } 
} 

我希望我正確解釋這個問題,任何幫助,將不勝感激。

回答

1

禁用片段之間的刷卡

viewPager.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       return true; 
      } 
     }); 

希望這些信息可以幫助您

+0

您的解決方案解決了垂直滾動的問題,但現在儘管片段之間不允許刷卡,屏幕一點移動小朝下一個片段 –