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?
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);
où view
est votre RelativeLayout
Cela fonctionne bien pour moi. J'espère que cela vous aide
Dans votre AndroidManifest.xml, assurez-vous que l'attribut "windowSoftInputMode" est défini sur "adjustResize".
<activity Android:name=".activities.YourActivity" Android:windowSoftInputMode="adjustResize">
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.
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 .