4

私はこの問題の解決策をたくさん探しましたが、どうやら見つけられませんでした。名前が示すように、私は Webview を持つシンプルな Android アプリを持っています。

public class MainActivity extends Activity {
   protected FrameLayout webViewPlaceholder;
   protected WebView webView;
   final Context myApp = this;
   @Override
   public void onCreate(Bundle savedInstanceState)
   {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      // Initialize the UI
      initUI();
   }

   protected void initUI()
   {
    // Retrieve UI elements
    webViewPlaceholder = ((FrameLayout)findViewById(R.id.webViewPlaceholder));

    // Initialize the WebView if necessary
    if (webView == null)
    {
        // Create the webview
        webView = new WebView(this);
        webView.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        webView.getSettings().setSupportZoom(true);
        webView.getSettings().setBuiltInZoomControls(true);
        webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
        webView.setScrollbarFadingEnabled(true);
        webView.getSettings().setLoadsImagesAutomatically(true);

        // Load the URLs inside the WebView, not in the external web browser
        webView.setWebViewClient(new WebViewClient());
        //webView.setWebChromeClient(new CustomChromeClient(this));
        webView.setWebChromeClient(new WebChromeClient() {  
            @Override  
            public boolean onJsAlert(WebView view, String url, String message, final android.webkit.JsResult result)   
            {  
                new AlertDialog.Builder(myApp)  
                    .setTitle("javaScript dialog")  
                    .setMessage(message)  
                    .setPositiveButton(android.R.string.ok,  
                            new AlertDialog.OnClickListener()   
                            {  
                                public void onClick(DialogInterface dialog, int which)   
                                {  
                                    result.confirm();  
                                }  
                            })  
                    .setCancelable(false)  
                    .create()  
                    .show();  

                return true;  
            };
            public void onShowCustomView(View view, CustomViewCallback callback){
                super.onShowCustomView(view, callback);
                Log.i("ChromeCLient", "onshowCustomView");
                new AlertDialog.Builder(myApp)  
                .setTitle("javaScript dialog")  
                .setMessage("ajbdlsakndsland")  
                .setCancelable(true)  
                .create()  
                .show();  
            }
            @Override
            public void onHideCustomView() {
                super.onHideCustomView();
                Log.i("ChromeCLient", "onhideCustomView");
            }
        });  

        webView.getSettings().setJavaScriptEnabled(true);
        if (Build.VERSION.SDK_INT < 8) {
          webView.getSettings().setPluginsEnabled(true);
        } else {
          webView.getSettings().setPluginState(WebSettings.PluginState.ON);
        }
        // Load a page
        webView.loadUrl("http://jsbin.com/ijixe4/3");
    }

    // Attach the WebView to its placeholder
    webViewPlaceholder.addView(webView);
}

@Override
public void onConfigurationChanged(Configuration newConfig)
{
    if (webView != null)
    {
        // Remove the WebView from the old placeholder
        webViewPlaceholder.removeView(webView);
    }

    super.onConfigurationChanged(newConfig);

    // Load the layout resource for the new configuration
    setContentView(R.layout.activity_main);

    // Reinitialize the UI
    initUI();
}

@Override
protected void onSaveInstanceState(Bundle outState)
{
    super.onSaveInstanceState(outState);

    // Save the state of the WebView
    webView.saveState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
    super.onRestoreInstanceState(savedInstanceState);

    // Restore the state of the WebView
    webView.restoreState(savedInstanceState);
}
}

私の問題は次のとおりです。webview に読み込まれるサイトは、単純な iframe が埋め込まれた youtube ビデオを含むサイトです。YouTube ビデオでフルスクリーン ボタンを押すと、マニフェストで screenOrientation="portrait" に設定していても、アプリの向きが変更されます。フルスクリーンを終了すると、ビデオの再生中に (バックグラウンドで) 再生が続けられますが、方向の変更により Web ビューが再作成されます。向きが横向きから縦向きになったときに、アクティビティの onDestroy() メソッドで webview を破棄しようとしました。しかし、それは役に立ちませんでした。CustomWebChromeClient を webview に設定して onShowCustomView() メソッドを実装しようとしましたが、HTML5 ビデオを使用しない限り、onShowCustomView() は呼び出されないようです。私'

この問題/バグを解決する他の方法はありますか? HTML5 の video タグはあまり使いたくありません。前もって感謝します。

4

2 に答える 2

5

onPause および onResume メソッドをオーバーライドし、次のように webView で同じメソッドを呼び出すだけです。

@Override
protected void onResume() {
    super.onResume();
    this.webView.onResume();
}

@Override
protected void onPause() {
    super.onPause();
    this.webView.onPause();
}
于 2014-05-25T04:37:36.983 に答える
1

同じ問題に直面しているときにこれを見つけました:

webView.loadData("", "text/html", "utf-8"); // in onDestroy/onFinish

ビデオの再生を停止します。役立つかもしれません。それがあなたに役立つかどうかは今は言えませんが、方向の変更などで試してみる必要があります

于 2013-03-14T16:02:04.933 に答える