いつもお世話になっております。
問題点
早速ですが、表題に関してです。
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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。