以下は、アプリのactionBar/toolbar/tabBarと、ViewPager(webView)を含むnestedScrollViewの正しい動作を処理するためのコードです。 ViewPagerは基本的に通常のwebViewです。
ViewPagerを垂直方向にスクロールできないことを除いて、すべて正常に機能します。 NestedScrollViewのみがスクロールされています。 Facebookアプリと同じ動作が必要です。ニュースフィード(webView)をスクロールすると、tabBarによってツールバーが垂直方向に見えなくなります。
<Android.support.design.widget.CoordinatorLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" xmlns:app="http://schemas.Android.com/apk/res-auto" xmlns:tools="http://schemas.Android.com/tools" tools:context=".ui.activity.FragmentContainer" Android:layout_width="match_parent" Android:layout_height="match_parent" Android:orientation="vertical" > <Android.support.design.widget.AppBarLayout Android:layout_width="match_parent" Android:layout_height="wrap_content" > <Android.support.v7.widget.Toolbar Android:id="@+id/toolbar" app:theme="@style/M.Toolbar" app:popupTheme="@style/M.Toolbar.PopupTheme" Android:layout_width="match_parent" Android:layout_height="?attr/actionBarSize" app:layout_scrollFlags="scroll|enterAlways" > </Android.support.v7.widget.Toolbar> <Android.support.design.widget.TabLayout Android:id="@+id/tabs" Android:layout_width="match_parent" Android:layout_height="wrap_content" app:tabMode="scrollable" Android:visibility="gone" Android:background="@color/background" app:background="@color/background" /> </Android.support.design.widget.AppBarLayout> <Android.support.v4.widget.NestedScrollView Android:layout_height="match_parent" Android:layout_width="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior" Android:background="@Android:color/transparent" Android:fillViewport="true" > <com.m.ui.util.EdgeScrollViewPager Android:id="@+id/viewpager" Android:layout_width="match_parent" Android:layout_height="match_parent" Android:background="@Android:color/transparent" Android:visibility="visible" > </com.m.ui.util.EdgeScrollViewPager> </Android.support.v4.widget.NestedScrollView> </Android.support.design.widget.CoordinatorLayout>
そこで、viewPager(webView)をスクロールできるようにするために、webViewを拡張する新しいクラスを追加しました。
パブリッククラスTouchyWebViewはWebViewを拡張します{
public TouchyWebView(Context context) { super(context); } public TouchyWebView(Context context, AttributeSet attrs) { super(context, attrs); } public TouchyWebView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onTouchEvent(MotionEvent event){ requestDisallowInterceptTouchEvent(true); return super.onTouchEvent(event); } }
これにより、スクロール可能になるviewPager(webView)の問題が解決されます。ただし、NestedScrollViewは静的になり、tabBar /ツールバーを垂直方向にスクロールすることを拒否します。そのため、webView OR tabBar-toolbarをスクロールすることに固執しています。viewPager(webView)とNestedScrollView(tabBar /ツールバー)の両方を同時にスクロール可能にするにはどうすればよいですか?
私のwebView
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:layout_width="match_parent" Android:layout_height="match_parent" Android:background="@Android:color/white"> <com.m.ui.base.TouchyWebView Android:id="@+id/web_webview" Android:layout_width="match_parent" Android:layout_height="match_parent" Android:background="@Android:color/transparent" Android:visibility="visible" /> <LinearLayout Android:id="@+id/web_loadingview" Android:orientation="vertical" Android:layout_width="wrap_content" Android:layout_height="wrap_content" Android:visibility="gone" Android:layout_gravity="center"> <ProgressBar style="?android:attr/progressBarStyleLarge" Android:layout_width="wrap_content" Android:layout_height="wrap_content" Android:indeterminate="true" Android:visibility="visible" Android:layout_gravity="center"/> </LinearLayout> </FrameLayout>
よろしく
このコードを試してください:
class NestedScrollWebView constructor(
context: Context,
attrs: AttributeSet): WebView(context, attrs), NestedScrollingChild2 {
private var lastMotionY = 0
private var nestedYOffset = 0
private val scrollOffset = IntArray(2)
private val scrollConsumed = IntArray(2)
private val childHelper = NestedScrollingChildHelper(this)
init {
isNestedScrollingEnabled = true
}
override fun onTouchEvent(event: MotionEvent?): Boolean {
if (event == null) return false
val motionEvent = MotionEvent.obtain(event)
val currentY = event.y.toInt()
when (event.action) {
MotionEvent.ACTION_DOWN -> {
nestedYOffset = 0
lastMotionY = currentY
startNestedScroll(View.SCROLL_AXIS_VERTICAL)
}
MotionEvent.ACTION_MOVE -> {
var deltaY = lastMotionY - currentY
if (dispatchNestedPreScroll(0, deltaY, scrollConsumed, scrollOffset)) {
deltaY -= scrollConsumed[1]
motionEvent.offsetLocation(0f, scrollOffset[1].toFloat())
nestedYOffset += scrollOffset[1]
}
lastMotionY = currentY - scrollOffset[1]
val oldY = scrollY
val newScrollY = Math.max(0, oldY + deltaY)
val dyConsumed = newScrollY - oldY
val dyUnconsumed = deltaY - dyConsumed
if (dispatchNestedScroll(0, dyConsumed, 0, dyUnconsumed, scrollOffset)) {
lastMotionY -= scrollOffset[1]
motionEvent.offsetLocation(0f, scrollOffset[1].toFloat())
nestedYOffset += scrollOffset[1]
}
motionEvent.recycle()
}
MotionEvent.ACTION_POINTER_DOWN,
MotionEvent.ACTION_UP,
MotionEvent.ACTION_CANCEL -> stopNestedScroll()
else -> { }
}
return super.onTouchEvent(event)
}
override fun startNestedScroll(axes: Int, type: Int) = childHelper.startNestedScroll(axes, type)
override fun stopNestedScroll(type: Int) = childHelper.stopNestedScroll(type)
override fun hasNestedScrollingParent(type: Int) = childHelper.hasNestedScrollingParent(type)
override fun dispatchNestedPreScroll(dx: Int, dy: Int, consumed: IntArray?, offsetInWindow: IntArray?, type: Int) =
childHelper.dispatchNestedPreScroll(dx, dy, consumed, offsetInWindow, type)
override fun dispatchNestedScroll(dxConsumed: Int, dyConsumed: Int, dxUnconsumed: Int, dyUnconsumed: Int, offsetInWindow: IntArray?, type: Int) =
childHelper.dispatchNestedScroll(dxConsumed, dyConsumed, dxUnconsumed, dyUnconsumed, offsetInWindow, type)
}
レイアウトでは、WebViewのみを残します。
<com.widget.NestedScrollWebView
Android:id="@+id/webview"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
それは私のために働きます、XMLファイルのNestedScrollviewにこの行を追加してください。
Android:fillViewport="true"
次に、Webビューの高さwrap_contentを設定します。
<WebView
Android:id="@+id/webview"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"/>
同様の問題があり、setFillViewport (true)
コードの一部で解決しました
NestedScrollView scrollView = (NestedScrollView) findViewById (R.id.nest_scrollview);
scrollView.setFillViewport (true);
そしてフラグメントの中に私が座っていたlistViewがありましたAndroid:nestedScrollingEnabled="true"
..スクロールの問題を修正しました