web-dev-qa-db-fra.com

Le défilement ne fonctionne pas dans NestedScrollView lorsque vous essayez de faire défiler les vues avec des événements de clic

J'utilise un NestedScrollView dans une mise en page et j'essaie d'utiliser le nouveau CoordinatorLayout de la bibliothèque de support de conception pour CollapsingToolbarLayout.

Mon fichier de mise en page ressemble à ceci:

<?xml version="1.0" encoding="utf-8"?>
<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/appbar"
        Android:layout_width="match_parent"
        Android:layout_height="200dp"
        Android:fitsSystemWindows="true"
        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="wrap_content"
            Android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"

            app:expandedTitleMarginStart="48dp"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">
            <!--            app:expandedTitleMarginEnd="64dp"-->
            <ImageView
                Android:layout_width="match_parent"
                Android:layout_height="200dp"
                Android:scaleType="centerCrop"
                Android:src="@drawable/image_load_default_big" />

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

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

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

    <Android.support.v4.widget.NestedScrollView
        Android:id="@+id/nestedScrollVw"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:layout_scrollFlags="scroll|enterAlways"
        Android:fitsSystemWindows="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <RelativeLayout
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:clickable="false"
            Android:fitsSystemWindows="true">

            <LinearLayout
                Android:id="@+id/changePasswordButtonContainer"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:orientation="vertical">

                <Button
                    Android:id="@+id/changePasswordExpand"
                    Android:layout_width="match_parent"
                    Android:layout_height="55dp"
                    Android:background="@drawable/back_img"
                    Android:text="Change Your Password"
                    Android:textColor="@color/white"
                    Android:textStyle="bold" />
            </LinearLayout>


            <LinearLayout
                Android:id="@+id/changePasswordContainer"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_below="@id/changePasswordButtonContainer"
                Android:layout_centerInParent="true"
                Android:orientation="vertical"
                Android:padding="10dp">


                <TextView
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    Android:layout_gravity="center_horizontal"
                    Android:text="Edit Your Password"
                    Android:textColor="@color/orange" />

                <EditText
                    Android:id="@+id/etUserName"
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    Android:layout_marginTop="10dp"
                    Android:background="@drawable/edittext_default_bg"
                    Android:drawableLeft="@drawable/password_icon"
                    Android:drawableRight="@drawable/tick"
                    Android:hint=" Old Password"
                    Android:padding="12dp"
                    Android:password="true"
                    Android:textColorHint="#b5b5b5" />

                <EditText
                    Android:id="@+id/etPass"
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    Android:layout_marginTop="10dp"
                    Android:background="@drawable/edittext_default_bg"
                    Android:drawableLeft="@drawable/password_icon"
                    Android:drawableRight="@drawable/cross"
                    Android:hint=" New Password"
                    Android:padding="12dp"
                    Android:password="true"
                    Android:textColorHint="#b5b5b5" />

                <RadioButton
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    Android:paddingBottom="20dp"
                    Android:paddingTop="20dp"
                    Android:text="show password" />

                <Button
                    Android:id="@+id/btnSingIn"
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    Android:layout_margin="4dp"
                    Android:background="@drawable/login_button_background"
                    Android:paddingBottom="8dp"
                    Android:paddingTop="8dp"
                    Android:text="Done"
                    Android:textColor="@color/white"
                    Android:textStyle="bold" />
            </LinearLayout>

            <LinearLayout
                Android:id="@+id/dealerToDealerContainer"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_below="@+id/changePasswordContainer"
                Android:orientation="vertical">

                <Button
                    Android:id="@+id/dealerToDealerExpand"
                    Android:layout_width="match_parent"
                    Android:layout_height="55dp"
                    Android:background="@drawable/back_img"
                    Android:text="Dealer To Dealer Platform No"
                    Android:textColor="@color/white"
                    Android:textStyle="bold" />
            </LinearLayout>

            <LinearLayout
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_below="@id/dealerToDealerContainer"
                Android:layout_centerInParent="true"
                Android:orientation="vertical"
                Android:padding="10dp">


                <TextView
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    Android:layout_gravity="center_horizontal"
                    Android:text="Edit Number"
                    Android:textColor="@color/orange" />

                <EditText
                    Android:id="@+id/dealerToDealerNo"
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    Android:layout_marginTop="10dp"
                    Android:background="@drawable/edittext_default_bg"
                    Android:drawableLeft="@drawable/password_icon"
                    Android:drawableRight="@drawable/tick"
                    Android:hint=" 56546789"
                    Android:padding="12dp"
                    Android:password="true"
                    Android:textColorHint="#b5b5b5" />

                <Button
                    Android:id="@+id/dealerToDealerNoDone"
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    Android:layout_margin="4dp"
                    Android:background="@drawable/login_button_background"
                    Android:paddingBottom="8dp"
                    Android:paddingTop="8dp"
                    Android:text="Done"
                    Android:textColor="@color/white"
                    Android:textStyle="bold" />
            </LinearLayout>

        </RelativeLayout>
    </Android.support.v4.widget.NestedScrollView>
</Android.support.design.widget.CoordinatorLayout>

Lorsque j'essaie de faire défiler, cela ne fonctionne parfois pas. la raison en est que d'autres éléments de mise en page avec des événements de clic consomment l'événement tactile. Fondamentalement, EditText, RadioButton, Button consomment des événements tactiles. Des suggestions pour résoudre ce problème?

33
Arun

J'ai eu le même problème. Cela se produit uniquement lorsque la hauteur du contenu NestedScrollView est inférieure à la hauteur de l'écran de l'appareil. La solution consiste donc à utiliser la méthode setMinimumHeight(..) pour la vue à l'intérieur de votre NestedScrollView pour la redimensionner à la hauteur de l'écran:

DisplayMetrics displaymetrics = new DisplayMetrics();
getBaseActivity().getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int screenHeight = displaymetrics.heightPixels;

int actionBarHeight = 0;
TypedValue tv = new TypedValue();
if (getBaseActivity().getTheme().resolveAttribute(Android.R.attr.actionBarSize, tv, true)) {
    actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,getResources().getDisplayMetrics());
}

view.setMinimumHeight(screenHeight - actionBarHeight);

view est votre RelativeLayout

Cela fonctionne bien pour moi. J'espère que cela vous aide

21
smbd uknow

Dans votre AndroidManifest.xml, assurez-vous que l'attribut "windowSoftInputMode" est défini sur "adjustResize".

<activity Android:name=".activities.YourActivity"  Android:windowSoftInputMode="adjustResize">
2
user3546621

L'un de vos ScrollViews enverra tous les événements à la première vue qui répondent vrai sur dispatchMotionEvent.

Vous pouvez éviter d'utiliser un tel scénario dans votre application OR remplacer toutes les méthodes dispatchMotionEvent (à partir des parchemins et des vues) pour ne pas consommer ACTION_DOWN.

2
Marcos Vasconcelos

La solution ici (une solution de contournement pour ce problème google en remplaçant nestedScrollview) https://Gist.github.com/chrisbanes/8391b5adb9ee42180893300850ed02f2 a fonctionné comme un charme!

Définissez FixAppBarLayoutBehavior.Java

/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.Apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package your.package;

import Android.content.Context;
import Android.support.design.widget.AppBarLayout;
import Android.support.design.widget.CoordinatorLayout;
import Android.support.v4.view.ViewCompat;
import Android.util.AttributeSet;
import Android.view.View;

/**
 * Workaround AppBarLayout.Behavior for https://issuetracker.google.com/66996774
 *
 * See https://Gist.github.com/chrisbanes/8391b5adb9ee42180893300850ed02f2 for
 * example usage.
 *
 * Change the package name as you wish.
 */
public class FixAppBarLayoutBehavior extends AppBarLayout.Behavior {

    public FixAppBarLayoutBehavior() {
        super();
    }

    public FixAppBarLayoutBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public void onNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child, View target,
            int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed, int type) {
        super.onNestedScroll(coordinatorLayout, child, target, dxConsumed, dyConsumed,
                dxUnconsumed, dyUnconsumed, type);
        stopNestedScrollIfNeeded(dyUnconsumed, child, target, type);
    }

    @Override
    public void onNestedPreScroll(CoordinatorLayout coordinatorLayout, AppBarLayout child,
            View target, int dx, int dy, int[] consumed, int type) {
        super.onNestedPreScroll(coordinatorLayout, child, target, dx, dy, consumed, type);
        stopNestedScrollIfNeeded(dy, child, target, type);
    }

    private void stopNestedScrollIfNeeded(int dy, AppBarLayout child, View target, int type) {
        if (type == ViewCompat.TYPE_NON_TOUCH) {
            final int currOffset = getTopAndBottomOffset();
            if ((dy < 0 && currOffset == 0)
                    || (dy > 0 && currOffset == -child.getTotalScrollRange())) {
                ViewCompat.stopNestedScroll(target, ViewCompat.TYPE_NON_TOUCH);
            }
        }
    }
}

Utilisation en Java:

AppBarLayout abl = findViewById(R.id.app_bar);
((CoordinatorLayout.LayoutParams) abl.getLayoutParams()).setBehavior(new FixAppBarLayoutBehavior());

Utilisation en xml:

<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/app_bar"
            Android:layout_height="..."
            Android:layout_width="..."
            app:layout_behavior="your.package.FixAppBarLayoutBehavior">

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

    <!-- Content -->

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

Ceci est fourni dans le post Cliquez sur ne pas travailler sur RecyclerView dans CoordinatorLayout lors du défilement .

1
Surekha