11

最近、私は Android Design Support Library を使用しました。折りたたみツールバー用の次のコードがあります。

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <android.support.design.widget.AppBarLayout
        android:id="@+id/media_detail_appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        >

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/collapsing_toolbar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_scrollFlags="scroll|exitUntilCollapsed"
            app:contentScrim="?attr/colorPrimary"
            >

            <include
                layout="@layout/layout_card"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                />

            <android.support.v7.widget.Toolbar
                android:id="@+id/media_detail_toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
                app:layout_collapseMode="pin"
                />

        </android.support.design.widget.CollapsingToolbarLayout>

    </android.support.design.widget.AppBarLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
        >

        <android.support.design.widget.TabLayout
            android:id="@+id/media_detail_tabs"
            android:layout_width="match_parent"
            android:layout_height="?android:attr/actionBarSize"
            android:background="@color/blue_2"
            app:tabMode="scrollable"
            />

        <android.support.v4.view.ViewPager
            android:id="@+id/view_pager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />

    </LinearLayout>

</android.support.design.widget.CoordinatorLayout>

View Pager 用に 2 つのフラグメントがあります。1 つは NestedScrollView で、もう 1 つは Recycler View です。私の問題は NestedScrollView です。以下のコードです。

<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        >
    </LinearLayout>
</android.support.v4.widget.NestedScrollView>

私の問題は、ビューを上にスクロールすると、指が横に少し動くとすぐに、ビューページャーの水平スクロールがトリガーされることです。それを避けるために私を助けてくれませんか?上下にスクロールすると、ビュー ページャーがトリガーされません。私のリサイクラービューフラグメントではうまく機能します。ありがとう。

4

2 に答える 2

1

これらのライブラリの最新バージョンで同じレイアウトを試しました

compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'

期待どおりに機能します。つまり、次のとおりです。

ジェスチャが主に垂直スクロール(斜めであっても) である場合は、NestedScrollView がスクロールをトリガーします。それ以外の場合、ジェスチャが主に水平方向のスワイプである場合(垂直方向のギャップが最小限であっても)、ViewPager がスワイプをトリガーします。解決するには、ライブラリをアップグレードしてください。

于 2016-01-18T14:54:50.513 に答える
0

この問題に対してこれまでに思いついた最善の解決策は、タッチイベントを追跡し、ユーザーが垂直方向にスクロールしたときを把握し、ユーザーが画面から指を離すまで ViewPager のスクロールを無効にすることです。

これをアクティビティに追加します。

private float startX;
private float startY;

@Override
public boolean dispatchTouchEvent(MotionEvent event)
{
    if (event.getAction() == MotionEvent.ACTION_DOWN)
    {
        startX = event.getX();
        startY = event.getY();
    }
    else if (event.getAction() == MotionEvent.ACTION_MOVE &&
        Math.abs(event.getX() - startX) < Math.abs(event.getY() - startY) &&
        Math.abs(event.getY() - startY) > 20)
    {
        ViewPager viewPager = findViewById(R.id.view_pager);
        viewPager.requestDisallowInterceptTouchEvent(true);
    }

    return super.dispatchTouchEvent(event);
}

カップルのコメント:

  • requestDisallowInterceptTouchEventは、ユーザーが画面から指を離すまで、ViewPager がタッチ イベントをインターセプトすることを禁止します。その後、ユーザーが水平スクロールを開始してタブを変更すると、通常は機能します。
  • 20は縦スクロール距離のしきい値で、私が最も効果的であることがわかりました。自由に変更してください。
于 2019-09-13T22:42:25.690 に答える