0

My application has a WebView on top. For showing things, I use Toast. But the Toast box has never shown if WebView appears, while before WebView shows, Toast is visible. I was wondering if Toast was likely covered by WebView. Did anyone have the same problems?

Thanks.

EDITING!!! Hi, thank you for all your inputs. I found I posted a wrong question for my problems. I found that the real problems are the following. In the code, I use setOnClickListener to register a callback for the button. In debugging, I found that the callback is not called for some reason, so the Toast statement is not called, and it is not covered by webview.

Then, I tried the onclick attributes in xml layout for defining a callback clickGo for the button. This one works when I press the button, and the Toast shows.

Now, my question is what is the difference between setOnClickListener and onlick.

One more question, in my clickGo, I refresh the webview. The webview indeed reloads when button is clicked. But in the meanwhile the spinner is also reloaded, and the selection position is reset to the 0-th. How can I prevent this?

Thank you again!

    public class MainActivity extends Activity {

      JSONArray jArray;
      String result = null;
      InputStream is = null;
      StringBuilder sb=null;
      private Spinner spinner;
      private Button btnSubmit;

      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        addListenerOnButton();
        addListenerOnSpinnerItemSelection();
        new DownloadTask().execute("www.google.com");
      }

      @Override
      public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
      }

      // Given a string representation of a URL, sets up a connection and gets
      // an input stream.
      private String downloadUrl(String urlString) throws IOException {
        HttpClient httpClient = new DefaultHttpClient();
        HttpGet get = new HttpGet(urlString);

        HttpResponse response = httpClient.execute(get);

        // Build up result
        return EntityUtils.toString(response.getEntity());
      }

      public void addListenerOnSpinnerItemSelection() {
        spinner = (Spinner) findViewById(R.id.spinner);
        spinner.setOnItemSelectedListener(new CustomOnItemSelectedListener());
      }

      public void clickGo(View v) {
        Toast toast = Toast.makeText(MainActivity.this,
            "OnClickListener : " +
              "\nSpinner 1 : "+ String.valueOf(spinner.getSelectedItem()),
                    Toast.LENGTH_SHORT);
        toast.setGravity(Gravity.TOP, 0, 0);
        toast.show();
        new DownloadTask().execute("www.google.com");
      }

      // get the selected dropdown list value
      public void addListenerOnButton() {

        spinner = (Spinner) findViewById(R.id.spinner);
        btnSubmit = (Button) findViewById(R.id.button);

        btnSubmit.setOnClickListener(new OnClickListener() {

          @Override
          public void onClick(View v) {

            Toast toast = Toast.makeText(MainActivity.this,
            "OnClickListener : " +
                "\nSpinner 1 : "+ String.valueOf(spinner.getSelectedItem()),
                    Toast.LENGTH_SHORT);
          toast.setGravity(Gravity.TOP, 0, 0);
          toast.show();
          new DownloadTask().execute("www.google.com");

        }

      });
    }
`
    // Implementation of AsyncTask used to download XML feed from stackoverflow.com.
    private class DownloadTask extends AsyncTask<String, Void, String> {

      @Override
      protected String doInBackground(String... urls) {
         return downloadUrl(urls[0]);
      }

      @Override
      protected void onPostExecute(String result) {
        setContentView(R.layout.activity_main);
        // Displays the HTML string in the UI via a WebView
        WebView myWebView = (WebView) findViewById(R.id.webview);
        WebSettings webSettings = myWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        myWebView.loadUrl(result);
      }
    }
    }



    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="fill_parent" 
                  android:layout_height="fill_parent" 
                  android:orientation="vertical" >
   <LinearLayout android:layout_width="match_parent" 
                     android:layout_height="wrap_content" 
                     android:orientation="horizontal" >
          <TextView android:id="@+id/text"
                    android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                    android:text="@string/word" />
          <Button android:id="@+id/button"
              android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="Go" 
                  android:onClick="clickGo" />
    </LinearLayout>
  <Spinner android:id="@+id/spinner"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:entries="@array/dictionaries"
           android:prompt="@string/dict_prompt" />      

  <WebView android:id="@+id/webview"
           android:layout_width="fill_parent"
           android:layout_height="fill_parent" />
    </LinearLayout>
Joe C
  • 2,757
  • 2
  • 26
  • 46

3 Answers3

0

I think this question could fix your question.

if this is could be shown, then I think toast should not be covered by WebView.

onPageFinished() never called (webview)!

mWebView.setWebViewClient(new WebViewClient() {
@Override  
public void onPageFinished(WebView view, String url) {
    super.onPageFinished(mWebView, url);
    Toast.makeText(getApplicationContext(), "Done!", Toast.LENGTH_SHORT).show();
}  

@Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
    Toast.makeText(getApplicationContext(), "Oh no! " + description, Toast.LENGTH_SHORT).show();
}

}); mWebView.loadUrl("http://pabebbe.com/m/register");

Community
  • 1
  • 1
0

no toast are drawn with maximum draw order as they are created during runtime.. make sure where are you creating your toast and if its really called.
EDIT
if your problem was about draw order try to use this code

private void moveViewToFront(View currentView)
    {
        ViewGroup vg = ((ViewGroup) currentView.getParent());
        vg.bringChildToFront(vg.getChildAt(vg.indexOfChild(currentView)));
    }

moveViewToFront((LinearLayout) findViewById(R.id.main_layout_2_linear));//pass your ui element you want to bring to the top
Ahmad Dwaik 'Warlock'
  • 5,953
  • 5
  • 34
  • 56
0

For this we need to add a webviewclient in android for the WebView we are adding in the xml. Then we have to register the webviewclient with the WebView we are creating using this method.

 myWebView.setWebViewClient(new MyWebViewClient());

Now,Create a new project and name it WebViewDemo. In main.xml,

<?xml version="1.0" encoding="utf-8"?>
<WebView  xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>

Now create a file named test.html inside the assets folder and copy this code into it. This is the html file that we are loading into the webview.

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN"
    "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">
<html>
<body>
<a href="http://www.google.com">Google</a>
<input type="button" value="Click Me" onClick="showAndroidToast('Hello Google!')"     
/>
<script type="text/javascript">
    function showAndroidToast(toast) {
        Android.showToast(toast);
    }

</script>
</body>
</html>

Now in the java code refer the webview and load the html file

WebView myWebView;
myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl("file:///android_asset/test.html");

Now enable the javascript by calling this function

WebSettings webSettings = myWebView.getSettings();
webSettings.setJavaScriptEnabled(true);

Now we have to add the javascript interface for listening to the javascript functions that we define in the webview html file.

myWebView.addJavascriptInterface(new JavaScriptInterface(this), "Android");

// outside oncreate
public class JavaScriptInterface {
    Context mContext;

    /** Instantiate the interface and set the context */
    JavaScriptInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */
    public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
        startActivity(new Intent(WebViewDemo.this, WebViewDemo.class));
    }
}

Now create a webview client for listening to the browser activities and doing specific function.

myWebView.setWebViewClient(new MyWebViewClient());

private class MyWebViewClient extends WebViewClient {
   @Override
   public boolean shouldOverrideUrlLoading(WebView view, String url) {
       if (Uri.parse(url).getHost().equals("www.coderzheaven.com")) {
           Toast.makeText(getApplicationContext(), "www.coderzheaven.com",      
Toast.LENGTH_SHORT).show();
           return false;
       }
       // Otherwise, the link is not for a page on my site, so launch another Activity                      
that handles URLs
       Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
       startActivity(intent);
       return true;
   }
}

Now we listen to the backbutton.

 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
   // Check if the key event was the BACK key and if there's history
   if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
       myWebView.goBack();
       return true;
   }
   return super.onKeyDown(keyCode, event);
  }

Now the project is over . Now run and see the result. Here is the full java code for this example

package com.coderzheaven.pack;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

public class WebViewDemo extends Activity {

WebView myWebView;
@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    myWebView = (WebView) findViewById(R.id.webview);
    myWebView.loadUrl("file:///android_asset/test.html");
    WebSettings webSettings = myWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);

    myWebView.addJavascriptInterface(new JavaScriptInterface(this), "Android");

   // myWebView.setWebViewClient(new WebViewClient());
    myWebView.setWebViewClient(new MyWebViewClient());
  }

  public class JavaScriptInterface {
    Context mContext;

    /** Instantiate the interface and set the context */
    JavaScriptInterface(Context c) {
        mContext = c;
    }

    /** Show a toast from the web page */
    public void showToast(String toast) {
        Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();
        startActivity(new Intent(WebViewDemo.this, WebViewDemo.class));
    }
  }

  private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (Uri.parse(url).getHost().equals("www.google.com")) {
            // This is my web site, so do not override; let my WebView load the page
            Toast.makeText(getApplicationContext(), "www.google.com",       
  Toast.LENGTH_SHORT).show();
            return false;
        }
        // Otherwise, the link is not for a page on my site, so launch another Activity   
  that handles URLs
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
        return true;
    }
  }

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // Check if the key event was the BACK key and if there's history
    if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
        myWebView.goBack();
        return true;
    }
    // If it wasn't the BACK key or there's no web page history, bubble up to the 
  default
    // system behavior (probably exit the activity)
    return super.onKeyDown(keyCode, event);
  }
} 
MAST3RMIND
  • 592
  • 2
  • 14