Access a webpage inside an Android Activity


While working on an Android app, I needed to get people to sign into Facebook however I didn’t want them to leave my app. The simple solution was to launch the browser through an intent; however, this was going to stop my activity which was unacceptable. I wanted a solution that enabled users to sign into the Facebook platform from inside the app. I had to embed a webview inside a dialog and pop up the required webview. How? Read on

Create the Activity that pops up the dialog

public class WebviewActivity extends Activity {
private static final String REGISTRATION_URL = "http://10.0.2.2/test.php";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.blog_learning);
new blog(this, REGISTRATION_URL, new DialogListener() {
@Override
public void onComplete(JSONObject values) {
// Do processing here with the JSONObject, you can change it if you so desire
Log.d("Oncomplete","called");
}
@Override
public void onError(DialogError e) {}
@Override
public void onStop() {}
}).show();
}
}

Create a Listener interface that links your Activity to the Dialog

public interface DialogListener {
public void onComplete(JSONObject values);
public void onError();
public void onStop();
}

The listener provides a callback pathway that monitor the state of the dialog; you can use it to get responses, check errors and do similar activities.

The Dialog class

Also, one thing, the Layouts and buttons are declared programmatically in the code, I couldn’t find a way to automatically load layout files in the onCreate method of the Dialog. If you know how to do this, kindly explain in the comments. Making a call to shouldOverrideUrlLoading in the WebViewClient doesn’t seem to work either, so you should do your processing in onPageFinished. Here is the code:


public class blog extends Dialog {
static final FrameLayout.LayoutParams FILL = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);
private static final String RESULT_URL = "XXX.php"; // Url for retrieving results
private String mUrl; //URL you are making a request to
private DialogListener mListener;
private ProgressDialog mSpinner;
private Button mButton;
private WebView mWebView;
private LinearLayout mWebViewContainer;
public blog(Context context, String url, DialogListener listener) {
super(context, android.R.style.Theme_NoTitleBar);
mUrl = url;
mListener = listener;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSpinner = new ProgressDialog(getContext());
mSpinner.requestWindowFeature(Window.FEATURE_NO_TITLE);
mSpinner.setMessage("Loading...");
requestWindowFeature(Window.FEATURE_NO_TITLE);
mButton = new Button(getContext());
mButton.setText("Close");
mWebViewContainer = new LinearLayout(getContext());
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onStop();
blog.this.dismiss();
}
});
//Close button should only become visible after the webview is fully loaded
mButton.setVisibility(View.INVISIBLE);
mWebView = new WebView(getContext());
mWebView.setVerticalScrollBarEnabled(false);
mWebView.setHorizontalScrollBarEnabled(false);
mWebView.setWebViewClient(new blog.blogWebViewClient());
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.loadUrl(mUrl);
mWebView.setVisibility(View.INVISIBLE);
mWebViewContainer.addView(mButton);
mWebViewContainer.addView(mWebView);
addContentView(
mWebViewContainer,
new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)
);
}

private class blogWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
return false;
}
@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
super.onReceivedError(view, errorCode, description, failingUrl);
mListener.onError(new DialogError(description, errorCode,failingUrl));
blog.this.dismiss();
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
mSpinner.show();
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
mSpinner.dismiss();
mWebViewContainer.setBackgroundColor(Color.TRANSPARENT);
mWebView.setVisibility(View.VISIBLE);
mButton.setVisibility(View.VISIBLE);
//Do result processing here
if (url.contains(RESULT_URL)) {
JSONObject obj = null;
try { URL json = new URL(url); }
catch (IOException e) { e.printStackTrace(); }
mListener.onComplete(obj);
blog.this.dismiss();
}
}
}
}

For more information on this, check this:

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.