0

私のアプリケーションには WebView があります。物事を示すために、Toast を使用します。しかし、WebView が表示される前に Toast が表示されるのに対し、WebView が表示される場合、Toast ボックスは表示されません。Toast が WebView でカバーされている可能性が高いかどうか疑問に思っていました。誰かが同じ問題を抱えていましたか?

ありがとう。

編集!!!こんにちは、すべての入力に感謝します。問題に対して間違った質問を投稿したことがわかりました。本当の問題は次のとおりであることがわかりました。コードでは、setOnClickListener を使用してボタンのコールバックを登録します。デバッグ中、何らかの理由でコールバックが呼び出されていないため、Toast ステートメントが呼び出されず、webview でカバーされていないことがわかりました。

次に、ボタンのコールバック clickGo を定義するために、xml レイアウトで onclick 属性を試しました。これは、ボタンを押すと機能し、トーストが表示されます。

さて、私の質問は、setOnClickListener と onlick の違いは何ですか。

もう 1 つの質問です。私の clickGo で、Web ビューを更新します。ボタンをクリックすると、WebView が実際にリロードされます。ただし、その間にスピナーもリロードされ、選択位置は 0 番目にリセットされます。どうすればこれを防ぐことができますか?

ありがとうございました!

    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>
4

3 に答える 3

0

この質問はあなたの質問を解決できると思います。

これが表示される場合、トーストは WebView でカバーされるべきではないと思います。

onPageFinished() は呼び出されませんでした (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 ");

于 2013-07-02T13:23:10.750 に答える
0

このために、xml に追加する WebView 用に Android に webviewclient を追加する必要があります。次に、このメソッドを使用して作成している WebView に webviewclient を登録する必要があります。

 myWebView.setWebViewClient(new MyWebViewClient());

ここで、新しいプロジェクトを作成し、WebViewDemo という名前を付けます。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"
/>

次に、assets フォルダー内に test.html という名前のファイルを作成し、このコードをコピーします。これは、webview にロードする html ファイルです。

 <?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>

Javaコードでwebviewを参照し、htmlファイルをロードします

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

この関数を呼び出して JavaScript を有効にします

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

ここで、webview html ファイルで定義した JavaScript 関数をリッスンするための JavaScript インターフェイスを追加する必要があります。

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));
    }
}

次に、ブラウザーのアクティビティをリッスンし、特定の機能を実行するための webview クライアントを作成します。

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;
   }
}

次に、戻るボタンを聞きます。

 @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);
  }

これでプロジェクトは終了です。実行して結果を確認します。この例の完全な Java コードは次のとおりです。

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);
  }
} 
于 2013-07-02T13:31:03.963 に答える
0

トーストは実行時に作成されるため、最大の描画順序で描画されません。トーストを作成している場所と、実際に呼び出されているかどうかを確認してください。
問題が描画順序に関するものである場合は編集
して、このコードを使用してみてください

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
于 2013-07-02T13:29:05.870 に答える