質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

3056閲覧

AndroidStudio Webview内にあるモーダルウィンドウのスクロール位置を取得するやり方が分からない

ludolf

総合スコア39

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2020/10/21 08:12

編集2020/10/21 08:19

いつもお世話になっております。

問題点

早速ですが、表題に関してです。
WebView内にモーダルウィンドウがありその中にスクロールバーがあるのですが、下にスクロールすると問題なく見れるのですが上に戻ろうとするとリフレッシュコントロールが動いて更新してしまいます。

やったこと

なのでスクロール位置が0以外の場合はリフレッシュコントロールは動かさないように書こうとしているのですが、モーダルウィンドウのスクロールが取得できません、、
setOnScrollChangeListenerを使用してモーダルウィンドウのスクロールの長さを取得しようとしても大元のスクロールしか取れません。

ご教授頂きたいこと

もしかしたら考え方自体が間違えているのか、それとも単純に取得するやり方が違うのかご教授頂ければ幸いです。
どんな質問や回答でも嬉しいですよろしくお願いします!

MainActivity.java

java

1package com.example.webviewtest; 2 3import android.os.Build; 4import android.os.Bundle; 5import android.util.Log; 6import android.view.KeyEvent; 7import android.view.View; 8import android.webkit.WebView; 9import android.webkit.WebViewClient; 10 11import androidx.annotation.RequiresApi; 12import androidx.appcompat.app.AppCompatActivity; 13import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; 14 15public class MainActivity extends AppCompatActivity { 16 17 final static String TAG = MainActivity.class.getSimpleName(); 18 19 WebView webView; 20 21 //マテリアルデザインのリフレッシュコントロール 22 SwipeRefreshLayout mSwipeRefreshLayout; 23 24 @RequiresApi(api = Build.VERSION_CODES.M) 25 @Override 26 protected void onCreate(Bundle savedInstanceState) { 27 super.onCreate(savedInstanceState); 28 setContentView(R.layout.activity_main); 29 30 webView = findViewById(R.id.webview); 31 32 // JavaScriptを有効にする 33 webView.getSettings().setJavaScriptEnabled(true); 34 35 //モーダルウィンドウにスクロールビューがあるサイト 36 webView.loadUrl("https://sunsuke.com/jquery/modal/index2.html"); 37 38 // SwipeRefreshLayoutの設定 39 mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh); 40 mSwipeRefreshLayout.setColorSchemeResources(R.color.main_color); 41 mSwipeRefreshLayout.setOnRefreshListener(mOnRefreshListener); 42 43 //webViewの細かな設定ども 44 webView.setWebViewClient(new WebViewClient() { 45 @Override 46 public boolean shouldOverrideUrlLoading(WebView view, String url) { 47 //url入れ込み 48 return false; 49 } 50 51 @Override 52 public void onPageFinished(WebView view, String url) { 53 super.onPageFinished(view, url); 54 //リフレッシュコントロールを閉じる 55 mSwipeRefreshLayout.setRefreshing(false); 56 } 57 }); 58 webView.setOnScrollChangeListener(new View.OnScrollChangeListener(){ 59 60 @Override 61 public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { 62 WebView webView = (WebView) v; 63 float contentHeight = webView.getContentHeight() * webView.getScaleY(); 64 float total = contentHeight * getResources().getDisplayMetrics().density - v.getHeight(); 65 // on some devices just 1dp was missing to the bottom when scroll stopped, so we subtract it to reach 1 66 float percent = Math.min(scrollY / (total - getResources().getDisplayMetrics().density), 1); 67 Log.d(TAG, "contentHeight: " + contentHeight); 68 Log.d(TAG, "total: " + total); 69 Log.d(TAG, "ScaleY: " + webView.getScaleY()); 70 Log.d(TAG, "v: " + v.getHeight()); 71 Log.d(TAG, "density: " + getResources().getDisplayMetrics().density); 72 73 //ここでリフレッシュコントロールを表示・非表示しようとしている 74 if(percent == 0){ 75 mSwipeRefreshLayout.setEnabled(true); 76 }else{ 77 mSwipeRefreshLayout.setEnabled(false); 78 } 79 } 80 }); 81 } 82 83 //リフレッシュコントロール 84 private SwipeRefreshLayout.OnRefreshListener mOnRefreshListener = new SwipeRefreshLayout.OnRefreshListener() { 85 @Override 86 public void onRefresh() { 87 webView.reload(); 88 } 89 }; 90 91 //戻る 92 public void back() { 93 if (webView.canGoBack()) { 94 webView.goBack(); 95 } else { 96 finish(); 97 } 98 } 99 100 //戻るボタンの設定 101 @Override 102 public boolean onKeyDown(int keyCode, KeyEvent event) { 103 if (keyCode == KeyEvent.KEYCODE_BACK) { 104 back(); 105 return true; 106 } 107 return false; 108 } 109} 110 111

activity_main.xml

xml

1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 tools:context=".MainActivity"> 7 8 <LinearLayout 9 android:layout_width="match_parent" 10 android:layout_height="match_parent"> 11 12 <androidx.swiperefreshlayout.widget.SwipeRefreshLayout 13 android:id="@+id/swipe_refresh" 14 android:layout_width="match_parent" 15 android:layout_height="match_parent"> 16 17 <WebView 18 android:id="@+id/webview" 19 android:layout_width="match_parent" 20 android:layout_height="match_parent" /> 21 </androidx.swiperefreshlayout.widget.SwipeRefreshLayout> 22 </LinearLayout> 23 24</androidx.constraintlayout.widget.ConstraintLayout>

app/build.grable

grable

1apply plugin: 'com.android.application' 2 3android { 4 compileSdkVersion 29 5 buildToolsVersion "29.0.0" 6 defaultConfig { 7 applicationId "com.example.webviewtest" 8 minSdkVersion 16 9 targetSdkVersion 29 10 versionCode 1 11 versionName "1.0" 12 testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 13 } 14 buildTypes { 15 release { 16 minifyEnabled false 17 proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 18 } 19 } 20} 21 22dependencies { 23 24 //追加したやつ 25 api 'com.google.android.material:material:1.2.0-alpha05' 26 implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" 27 implementation 'com.google.android.material:material:1.1.0' 28 29 30 implementation fileTree(dir: 'libs', include: ['*.jar']) 31 implementation 'androidx.appcompat:appcompat:1.1.0' 32 implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 33 testImplementation 'junit:junit:4.12' 34 androidTestImplementation 'androidx.test:runner:1.2.0' 35 androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' 36 37 38} 39

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

大変でしたが自己解決できました、、

Chromeアプリ(ChrominumAndroid)のオープンソースを解読して対処できました。
URL:https://github.com/kuoruan/Chromium-Android

WebViewクラスにある「onOverScrolledメソッド」が呼び出されたら適当な名前を付けたフラグ変数をtrueにして、SwipeRefreshLayoutクラスにある「canChildScrollUpメソッド」でそのフラグがTrueなのかFalaseなのかを判定すれば本問題を解決できました。

スクロールイベントがおかしいと思ったらChromeアプリを参考にすれば問題なし!

投稿2020/11/03 02:20

ludolf

総合スコア39

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問