Изменение логики обновления webView
Необходимо изменить подход обновления страницы, проведя пальцем вниз, где обновление должно происходить в верхней части веб-представления, размер которого ограничен 100 пикселями.
public class MainActivity extends Activity {
private WebView webView;
SwipeRefreshLayout mySwipeRefreshLayout;
private GestureDetector gestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = findViewById(R.id.webView);
mySwipeRefreshLayout = findViewById(R.id.swipeContainer);
setupWebView();
setupGestureDetector();
setupSwipeRefresh();
}
private void setupWebView() {
webView.setWebViewClient(new MyWebView(this));
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg);
}
});
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
webSettings.setDatabaseEnabled(true);
webSettings.setAllowFileAccess(true);
webSettings.setSupportMultipleWindows(true);
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
cookieManager.setAcceptThirdPartyCookies(webView,true);
}
String ua = webSettings.getUserAgentString()
.replace("; wv", "");
int uaIndex = ua.indexOf("Version");
ua = ua.substring(0, uaIndex)
.concat(getString(R.string.app_name))
.concat(ua.substring(uaIndex));
webSettings.setUserAgentString(ua);
webView.loadUrl("");
}
private void setupGestureDetector() {
gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if (e1 != null && e2 != null) {
if (e1.getY() <= 50 && distanceY < 0) { // check for swipe down at the top
mySwipeRefreshLayout.setRefreshing(true);
webView.reload();
}
}
return super.onScroll(e1, e2, distanceX, distanceY);
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
gestureDetector.onTouchEvent(event);
return super.onTouchEvent(event);
}
private void setupSwipeRefresh() {
webView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (webView.getScrollY() == 0) {
mySwipeRefreshLayout.setEnabled(true);
} else {
mySwipeRefreshLayout.setEnabled(false);
}
return false;
}
});
mySwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
webView.reload();
}
});
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if (mySwipeRefreshLayout.isRefreshing()) {
mySwipeRefreshLayout.setRefreshing(false);
}
}
});
}
}
............................................................
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:showIn="@layout/activity_main">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swipeContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<WebView
android:id="@+id/webView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true" />
</androidx.core.widget.NestedScrollView>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
</RelativeLayout>
На данный момент стандартная логика SwipeRefreshLayout работает.
Что не так с кодом и разметкой? Как заставить его работать как надо?
Пожалуйста, помогите решить эту проблему.
Ответы (1 шт):
Я бы предложил сделать через RelativeLayout прозрачную область и навесить на неё
(Ваша область).setOnTouchListener(new View.OnTouchListener(){
@Override
public boolean onTouch(View arg0, MotionEvent event)
{
switch(event.getAction()){
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
wv.reload();
break;
}
return false;
}
});
Правда, это может дать не совсем желаемый результат, так как если вы хотите добиться обновления страницы как в современных браузерах, я думаю, нужно использовать другой подход...