android 传递在视图剪辑边界之外绘制的子视图的触摸事件(ViewPager 第 1 页到第 2 页)

Dan*_*Dan 5 android android-viewpager

我的 Android ViewPager 已设置在边界外绘制视图(剪辑边界设置为 false)。我在页面上显示的所有视图上都有一个触摸事件侦听器。自定义视图显示在页面 1 上,绘制在其裁剪边界之外并溢出到页面 2。页面 1 上的触摸事件工作正常。滚动到第二页时,将显示剩余视图。问题是自定义视图(添加在页面 1 上)上的触摸事件在点击页面 2 时不会被调用。

PageViewActivity.cs

ViewPager mViewPager = (ViewPager) findViewById(R.id.pager);
mViewPager.setClipChildren(false);
mViewPager.setClipToPadding(false);
Run Code Online (Sandbox Code Playgroud)

PageViewFragment.cs

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.page_layout, container, false);
    setHasOptionsMenu(true);

    View view1=(View)v.findViewById(R.id.view1);
    view1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

        Toast.makeText(getActivity(), "View clicked",Toast.LENGTH_SHORT).show();    
        }
    });return v;    
Run Code Online (Sandbox Code Playgroud)

}

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:clipChildren="false" 
android:clipToPadding="false" >
<View
    android:id="@+id/view1"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_marginLeft="250dp"
    android:layout_marginTop="20dp"
    android:background="#ff0000" />
Run Code Online (Sandbox Code Playgroud)

片段布局 - page_layout.xml

有什么建议?

Tat*_*ize 0

这里\xe2\x80\x99s有一个问题。我们只能滑动中间的视图。这是因为触摸事件发生在 ViewPagers 边界之外。我们可以重写ViewPagerContainer的onTouchEvent并将事件分派给ViewPager来解决这个问题。

\n\n
private ViewPager mPager;\n\n@Override\nprotected void onFinishInflate() {\n    mPager = (ViewPager) getChildAt(0);\n}\n\n@Override\npublic boolean onTouchEvent(MotionEvent ev) {\n    return mPager.dispatchTouchEvent(ev);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

但事实是,您最好使用更现代的解决方案来解决这些问题。

\n\n
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"\n    xmlns:app="http://schemas.android.com/apk/res-auto"\n    xmlns:tools="http://schemas.android.com/tools"\n    android:id="@+id/main_content"\n    android:layout_width="match_parent"\n    android:layout_height="match_parent">\n\n    <android.support.design.widget.AppBarLayout\n        android:id="@+id/appbar"\n        android:layout_width="match_parent"\n        android:layout_height="wrap_content"\n        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">\n\n        <android.support.design.widget.TabLayout\n            android:id="@+id/result_tabs"\n            android:layout_width="match_parent"\n            android:layout_height="wrap_content"\n            android:background="@color/grey"\n            app:tabIndicatorColor="@color/colorPrimary"\n            app:tabMode="scrollable"\n            app:tabSelectedTextColor="@color/colorPrimary"\n            app:tabTextColor="@color/medium_grey" />\n    </android.support.design.widget.AppBarLayout>\n\n    <android.support.v4.view.ViewPager\n        android:id="@+id/viewpager"\n        android:layout_width="match_parent"\n        android:layout_height="match_parent"\n        app:layout_behavior="@string/appbar_scrolling_view_behavior" />\n\n</android.support.design.widget.CoordinatorLayout>\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此选项卡式布局和正确设置的视图页面。尽管一旦谷歌在其架构组件中完成了导航部分,这也将变得过时。

\n