使用片段

时间:2016-06-12 15:19:48

标签: android user-interface android-fragments android-viewpager

我正在使用ViewPagerFragmentStatePagerAdapter来显示片段列表Group A,这样我就可以通过触摸在片段之间滑动。来自Group A的每个片段都包含一个内部片段Group B

Group B的一个片段中,有一个Chart对象,可以启用水平滚动,与触摸侦听器进行拦截。

当用户尝试滚动Group A对象中的数据时,我无法想象如何避免ViewPager scorlling(Chart滑动)。

enter image description here

如图所示:

  • Chart涂成灰色。
  • Group A是2个片段:白色和绿色(在滑动时间拍摄的照片)
  • Group B红色内部片段。

有什么建议吗? 谢谢。

1 个答案:

答案 0 :(得分:2)

当用户触摸您的图表时,您可以禁用视图寻呼机的滑动功能,并在用户停止触摸您的图表时将其恢复。首先定义Non-Swipable ViewPager并使您的视图寻呼机NonSwipable。

public class NonSwipableViewPager extends ViewPager {
    private boolean canScroll = true;
    public NonSwipableViewPager(Context context) {
        super(context);
    }
    public NonSwipableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    public void setCanScroll(boolean canScroll) {
        this.canScroll = canScroll;
    }
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        return canScroll && super.onTouchEvent(ev);
    }
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return canScroll && super.onInterceptTouchEvent(ev);
    }

    public boolean isCanScroll() {
        return canScroll;
    }
}

将其保存在公共变量中。 (在活动中保留公共变量可能不是最好的做法。)

在图表中添加触控侦听器,并禁用视图寻呼机的滑动功能,如下所示:

            View yourChart = (YourChart) view.findViewById(R.id.your_chart);
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        if (activity.mainViewPager != null) {
                            activity.mainViewPager.setCanScroll(false);
                        }
                        break;

                    case MotionEvent.ACTION_UP:
                        if (activity.mainViewPager != null) {
                            activity.mainViewPager.setCanScroll(true);
                        }
                        break;
                }
                return false;
            }
        });