import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
+import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.util.Patterns;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
+import android.view.ViewTreeObserver;
import android.view.inputmethod.InputMethodManager;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
static String formattedUrlString;
static WebView mainWebView;
static ProgressBar progressBar;
+ static SwipeRefreshLayout swipeToRefresh;
static final String homepage = "https://www.duckduckgo.com";
@Override
setContentView(R.layout.activity_webview);
final EditText urlTextBox = (EditText) findViewById(R.id.urlTextBox);
+ swipeToRefresh = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayoutContainer);
mainWebView = (WebView) findViewById(R.id.mainWebView);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
+ // Implement swipe down to refresh.
+ swipeToRefresh.setColorSchemeColors(0xFF0097FF);
+ swipeToRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+ @Override
+ public void onRefresh() {
+ mainWebView.loadUrl(formattedUrlString);
+ }
+ });
+
+ // Only enable swipeToRefresh if is mainWebView is scrolled to the top.
+ mainWebView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
+ @Override
+ public void onScrollChanged() {
+ if (mainWebView.getScrollY() == 0) {
+ swipeToRefresh.setEnabled(true);
+ } else {
+ swipeToRefresh.setEnabled(false);
+ }
+ }
+ });
+
// setWebViewClient makes this WebView the default handler for URLs inside the app, so that links are not kicked out to other apps.
// Save the URL to formattedUrlString and update urlTextBox before loading mainWebView.
mainWebView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
- formattedUrlString=url;
+ formattedUrlString = url;
urlTextBox.setText(formattedUrlString);
mainWebView.loadUrl(formattedUrlString);
return true;
progressBar.setVisibility(View.VISIBLE);
} else {
progressBar.setVisibility(View.GONE);
+ // Stop the refreshing indicator if it is running.
+ swipeToRefresh.setRefreshing(false);
}
}
});
-<RelativeLayout
+<android.support.v4.widget.SwipeRefreshLayout
+ android:id="@+id/swipeRefreshLayoutContainer"
xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".Webview" >
+ android:layout_height="match_parent">
+ // SwipeRefreshLayout allows the user to swipe down to refresh.
- // FrameLayout lets the ProgressBar float on top of the LinearLayout.
- <FrameLayout
+ <RelativeLayout
+ android:id="@+id/relativeLayoutContainer"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:id="@+id/topFrameLayout">
+ android:layout_height="match_parent"
+ tools:context=".Webview" >
- <LinearLayout
+ // FrameLayout lets the ProgressBar float on top of the LinearLayout.
+ <FrameLayout
+ android:id="@+id/addressBarFrameLayout"
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:id="@+id/topBarLayout">
-
- // android:inputType="textUri" sets the keyboard to have a go arrow.
- <EditText
- android:id="@+id/urlTextBox"
- android:layout_width="0dp"
+ android:layout_height="wrap_content">
+
+ <LinearLayout
+ android:id="@+id/addressBarLinearLayout"
+ android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:inputType="textUri"
- android:imeOptions="actionGo"
- android:layout_weight="1"/>
-
- <Button
- android:id="@+id/goButton"
- android:text="@string/go_button"
- android:onClick="loadUrlFromTextBox"
- style="?android:attr/buttonStyleSmall"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
+ android:orientation="horizontal">
+
+ // android:inputType="textUri" sets the keyboard to have a go arrow.
+ <EditText
+ android:id="@+id/urlTextBox"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:inputType="textUri"
+ android:imeOptions="actionGo"
+ android:layout_weight="1"/>
+
+ <Button
+ android:id="@+id/goButton"
+ android:text="@string/go_button"
+ android:onClick="loadUrlFromTextBox"
+ style="?android:attr/buttonStyleSmall"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content" />
+
</LinearLayout>
- // android:max changes the maximum ProgressBar value from 10000 to 100 to match progress percentage.
- <ProgressBar
- android:id="@+id/progressBar"
- style="?android:attr/progressBarStyleHorizontal"
- android:layout_width="fill_parent"
- android:layout_height="7dp"
- android:layout_gravity="bottom"
- android:max="100"
- android:progressTint="#FF29A8FF"
- android:progressBackgroundTint="#FFFFFFFF"
- android:visibility="gone" />
- </FrameLayout>
-
- <WebView
- android:id="@+id/mainWebView"
- android:layout_width="match_parent"
- android:layout_height="fill_parent"
- android:layout_below="@id/topFrameLayout"
- android:focusable="true"
- android:focusableInTouchMode="true" />
-</RelativeLayout>
+ // android:max changes the maximum ProgressBar value from 10000 to 100 to match progress percentage.
+ <ProgressBar
+ android:id="@+id/progressBar"
+ style="?android:attr/progressBarStyleHorizontal"
+ android:layout_width="fill_parent"
+ android:layout_height="7dp"
+ android:layout_gravity="bottom"
+ android:max="100"
+ android:progressTint="#FF0097FF"
+ android:progressBackgroundTint="#FFFFFFFF"
+ android:visibility="gone" />
+ </FrameLayout>
+
+
+ <WebView
+ android:id="@+id/mainWebView"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:layout_below="@id/addressBarFrameLayout"
+ android:focusable="true"
+ android:focusableInTouchMode="true" />
+
+ </RelativeLayout>
+
+</android.support.v4.widget.SwipeRefreshLayout>