android - 重叠 fragment 和触摸事件

标签 android android-layout android-fragments

我有一个带有自定义PagerAdapterViewPager,它显示一组 fragment 。

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

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

我遇到过this answer但这不是同一个问题。 有没有人发现过类似的问题?处理此问题的最明智的方法是什么(除了懒惰的解决方案:将 PageTransformer 更改为不与 fragment 重叠的方法)?

编辑:

在我的 Fragment 类中,我有:

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 的建议,但这没有帮助:当前 fragment 下面的小部件仍然有可能接收事件而不是当前 fragment 的事件。

我还查看了 this open issue ,但没有成功。

最佳答案

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

Issue 58918 .

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

If I remember right it was after 4.1 that the framework respects a custom child drawing order as implied Z-ordering for dispatching touch events. If your views overlap after this page transformation they may not receive touch events in the expected order on older platform versions. Check which view is receiving the touch events to be certain.

If this is what you are seeing you have a few options:

  • Enforce the desired ordering as you add/remove child views in your PagerAdapter
  • Remove the X translation applied by the PageTransformer when a page is no longer fully visible - i.e. the "position" parameter reports a full -1 or 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);
        }
});

关于android - 重叠 fragment 和触摸事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19492564/

相关文章:

android - 错误 :Execution failed for task :app:transformClassesWithDexForDebug

Android fragment 隐藏在操作栏下

android - 如何在 RoomDatabase 中存储 Enum 的 ArrayList

android - 使用 OpenGL ES 1.0 在 Android 上进行离屏渲染的选项?

android - 从反射(reflect)在先前创建的 Activity 中的 Activity 更改语言

android - LinearLayout、RelativeLayout 和 AbsoluteLayout 有什么区别?

android - ActionMode Bar 的所有图标都没有在 Android 中显示?

java - 我无法在 Android 的 Baseadapter 中使用 viewgroup

android - 调整viewpager里面的view size,弥补tab height

android - 在 viewpager 中更改当前 fragment 的背景图像