2

我有ViewPager一个自定义PagerAdapter显示一组片段。

这些片段(故意)彼此重叠放置,以便我可以使用 PageTransformer 使其看起来好像用户正在从堆栈中滑动片段(几乎就像一副纸牌)。

问题是每个片段都有自己的Views/ Widgets(例如搜索栏),由于重叠,它们占据相同的坐标,有时触摸事件被当前片段下方的片段捕获(例如,用户调整搜索栏的位置,但不是更新当前显示的搜索栏,而是下一个片段中的搜索栏更新其进度)。

我遇到了这个答案,但这不是完全相同的问题。有没有人发现过类似的问题?处理此问题的最聪明的方法是什么(除了惰性解决方案:将 PageTransformer 更改为不重叠片段的方法)?

编辑:

在我的片段类中,我有:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)        
{
    View rootView = inflater.inflate(R.layout.fragment, container, false);

    rootView.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            return true;
        }
    });
}

正如 Zsombor Erdődy-Nagy 所建议的那样,但这无济于事:当前片段下方的小部件仍然有可能接收事件而不是当前片段。

我也看过这个未解决的问题,但没有成功。

4

3 回答 3

3

如果您仍在寻找解决方案,那么您应该看看这个:

问题 58918

在这里,您可以找到问题的答案。引用链接:

如果我没记错的话,在 4.1 之后,该框架将自定义子绘图顺序视为用于调度触摸事件的隐含 Z 顺序。如果您的视图在此页面转换后重叠,则它们可能无法在旧平台版本上按预期顺序接收触摸事件。检查哪个视图正在接收触摸事件以确定。

如果这是您所看到的,您有几个选择:

  • 在 PagerAdapter 中添加/删除子视图时强制执行所需的排序
  • 当页面不再完全可见时,移除由 PageTransformer 应用的 X 平移 - 即“位置”参数报告完整的 -1 或 1。

例子:

this.viewPager.setPageTransformer(true, new PageTransformer() {

        @Override
        public void transformPage(View page, float position) {
            float translationX;
            float scale;
            float alpha;

            if (position >= 1 || position <= -1) {
                // Fix for https://code.google.com/p/android/issues/detail?id=58918
                translationX = 0;
                scale = 1;
                alpha = 1;
            } else if (position >= 0) {
                translationX = -page.getWidth() * position;
                scale = -0.2f * position + 1;
                alpha = Math.max(1 - position, 0);
            } else {
                translationX = 0.5f * page.getWidth() * position;
                scale = 1.0f;
                alpha = Math.max(0.1f * position + 1, 0);
            }

            ViewHelper.setTranslationX(page, translationX);
            ViewHelper.setScaleX(page, scale);
            ViewHelper.setScaleY(page, scale);
            ViewHelper.setAlpha(page, alpha);
        }
});
于 2014-03-16T16:00:30.517 回答
0

在这种情况下,您的所有片段都必须有一个背景视图,以阻止 TochEvents 传播到后面的片段。

我猜你已经有这些片段的不透明背景,否则后面的片段会通过当前位于堆栈顶部的片段显示。因此,尝试为所有片段的根 ViewGroup 实例设置一个 ClickListener,它什么都不做,它只是捕获触摸事件。

于 2013-10-21T11:00:49.933 回答
0

如果有人遇到这个问题(这不仅可能发生在 ViewPager 中),只需将此属性添加到层次结构顶部的布局中即可:

android:clickable="true"

这样它会处理点击,而不是对它们做任何事情,但至少避免它们到达后台的片段。

于 2015-08-22T00:15:12.877 回答