レイアウトでNestedScrollViewを使用していますが、CollapsingToolbarLayoutのデザインサポートライブラリの新しいCoordinatorLayoutを使用しようとしています。
レイアウトファイルは次のようになります。
<?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>
スクロールしようとすると、動作しない場合があります。その理由は、クリックイベントを含むレイアウトの他の要素がタッチイベントを消費しているためです。基本的に、EditText、RadioButton、Buttonはタッチイベントを消費しています。この問題を解決するための提案はありますか?
同じ問題がありました。 NestedScrollViewコンテンツの高さがデバイス画面の高さより低い場合にのみ発生します。そのため、回避策は、NestedScrollView
内のビューにsetMinimumHeight(..)
メソッドを使用して、画面の高さにサイズ変更することです。
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
はRelativeLayout
です
私の前でうまくいく。それがあなたを助けることを願っています
AndroidManifest.xmlで、「windowSoftInputMode」属性が「adjustResize」に設定されていることを確認してください。
<activity Android:name=".activities.YourActivity" Android:windowSoftInputMode="adjustResize">
ScrollViewsの1つは、dispatchMotionEventでtrueと応答するすべてのイベントを最初のビューに送信します。
アプリでこのようなシナリオを使用することを避けることができますOR ACTION_DOWNを消費しないように、すべてのdispatchMotionEventメソッド(スクロールおよびビューから)をオーバーライドします。
ここでの解決策(nestedScrollviewをオーバーライドすることによるこのGoogleの問題の回避策) https://Gist.github.com/chrisbanes/8391b5adb9ee42180893300850ed02f2 は魔法のように機能しました!
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);
}
}
}
}
Javaでの使用:
AppBarLayout abl = findViewById(R.id.app_bar);
((CoordinatorLayout.LayoutParams) abl.getLayoutParams()).setBehavior(new FixAppBarLayoutBehavior());
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>
これはポストで提供されます スクロールするときCoordinatorLayoutのRecyclerViewで動作しないクリック 。