Gurjyot Singh
Gurjyot Singh

Reputation: 95

How to stop WebView app to going go homepage after every Swipe to refresh?

Every time I swipe to refresh, my app reloads to the homepage instead of reloading the same web-page. I tried every way to detect this behaviour but couldn't find out anything. Can you tell what's the issue here?

Swipe to refresh should only be resfreshing the current web page instead of the whole app right?

MainActivity.java

package com.yoalfaaz.yoalfaaz;

        import android.content.Intent;
        import android.os.Bundle;
        import android.support.design.widget.FloatingActionButton;
        import android.support.design.widget.Snackbar;
        import android.support.v4.widget.SwipeRefreshLayout;
        import android.support.v7.app.AppCompatActivity;
        import android.support.v7.widget.ShareActionProvider;
        import android.support.v7.widget.Toolbar;
        import android.view.View;
        import android.view.Menu;
        import android.view.MenuItem;
        import android.webkit.WebSettings;
        import android.webkit.WebView;
        import android.webkit.WebViewClient;
        import android.support.v4.view.MenuItemCompat;

public class MainActivity extends AppCompatActivity {
    private WebView YoWeb;
    private ShareActionProvider mShareActionProvider;

    SwipeRefreshLayout swipe;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        swipe = (SwipeRefreshLayout) findViewById(R.id.swiperefresh);
        swipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                LoadWeb();
            }
        });
        LoadWeb();
    }

    public void LoadWeb() {
        YoWeb = (WebView)findViewById(R.id.webview);
        WebSettings webSettings = YoWeb.getSettings();
        webSettings.setJavaScriptEnabled(true);
        YoWeb.loadUrl("https://www.yoalfaaz.com");
        swipe.setRefreshing(true);
        YoWeb.setWebViewClient(new WebViewClient() {

            //onPageFinished Method
            public void onPageFinished(WebView view, String url) {
                //Hide the SwipeRefreshLayout
                swipe.setRefreshing(false);
            }
        });
    }

    @Override
    public void onBackPressed() {
        if (YoWeb.canGoBack()) {
            YoWeb.goBack();
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        switch (item.getItemId()) {
            case R.id.action_settings:
                return true;

            default:
                return super.onOptionsItemSelected(item);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate menu resource file.
        getMenuInflater().inflate(R.menu.menu_main, menu);

        // Locate MenuItem with ShareActionProvider
        MenuItem item = menu.findItem(R.id.menu_item_share);

        // Fetch and store ShareActionProvider
        mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(item);

        // Return true to display menu
        return true;
    }

    // Call to update the share intent
    private void setShareIntent(Intent shareIntent) {
        if (mShareActionProvider != null) {
            mShareActionProvider.setShareIntent(shareIntent);
        }
    }

    //private Intent setShareIntent() {
    //    Intent shareIntent = new Intent();
    //    shareIntent.setAction(Intent.ACTION_SEND);
    //    shareIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
    //    shareIntent.setType("text/plain");
    //    startActivity(shareIntent);
    //    return shareIntent;
    //}
}

content_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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="com.yoalfaaz.yoalfaaz.MainActivity"
    tools:showIn="@layout/activity_main">

    <android.support.v4.widget.SwipeRefreshLayout

        android:id="@+id/swiperefresh"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

        <WebView
            android:id="@+id/webview"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            />

    </android.support.v4.widget.SwipeRefreshLayout>
</android.support.constraint.ConstraintLayout>

These are the two files responsible for swipe to refresh and you can see all the code that is there. I hope that you might be able to figure out exactly what's the issue here.

Upvotes: 1

Views: 997

Answers (1)

tim.paetz
tim.paetz

Reputation: 2771

Your SwipeRefreshLayout.OnRefreshListener is calling LoadWeb method. Inside LoadWeb you are calling YoWeb.loadUrl("https://www.yoalfaaz.com"); which means you are always setting the webview to go to that URL on refresh. Change your code to be like this:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    YoWeb = (WebView)findViewById(R.id.webview); // Move your declaration up here
    swipe = (SwipeRefreshLayout) findViewById(R.id.swiperefresh);
    swipe.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            LoadWeb(YoWeb.getUrl());  // Pass in the current url to refresh
        }
    });

    LoadWeb("https://www.yoalfaaz.com");  // load the home page only once
}

public void LoadWeb(String url) // Pass in URL you want to load
{  

    WebSettings webSettings = YoWeb.getSettings();
    webSettings.setJavaScriptEnabled(true);
    YoWeb.loadUrl(url);  // Load the URL passed into the method
    swipe.setRefreshing(true);
    YoWeb.setWebViewClient(new WebViewClient() {

        //onPageFinished Method
        public void onPageFinished(WebView view, String url) {
            //Hide the SwipeRefreshLayout
            swipe.setRefreshing(false);
        }
    });
}

Upvotes: 1

Related Questions