You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebView与iFrame视频全屏问题求助:已搁置多周亟待解决

Fixing WebView iFrame Video Fullscreen Issue

Hey there! I know how frustrating it is to be stuck on this for weeks—let's get that iframe video fullscreen working in your WebView right away. The core problem here is that your basic WebChromeClient doesn't handle the fullscreen callbacks required to switch the video to fullscreen mode. Here's a step-by-step solution:

Step 1: Update Your Layout

First, wrap your WebView in a FrameLayout (this will let us swap the WebView with the fullscreen video view easily). Your layout might look like this:

<FrameLayout
    android:id="@+id/webview_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <WebView
        android:id="@+id/webviewVideo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</FrameLayout>

Step 2: Implement a Custom WebChromeClient

You need to extend WebChromeClient and override the fullscreen-related methods. These methods handle showing/hiding the fullscreen video view and adjusting the window flags for proper fullscreen behavior.

Add these variables to your Activity/Fragment:

private View _fullscreenView;
private WebChromeClient.CustomViewCallback _fullscreenCallback;
private FrameLayout _webViewContainer;

Then initialize everything and set up the custom WebChromeClient:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    SetContentView(Resource.Layout.your_layout_name);

    _webViewContainer = FindViewById<FrameLayout>(Resource.Id.webview_container);
    WebView webView = FindViewById<WebView>(Resource.Id.webviewVideo);

    // Your existing WebView settings
    webView.ClearCache(true);
    webView.ClearHistory();
    webView.Settings.JavaScriptEnabled = true;
    webView.Settings.LoadWithOverviewMode = true;
    webView.Settings.UseWideViewPort = true;
    // Add these critical settings for media fullscreen
    webView.Settings.JavaScriptCanOpenWindowsAutomatically = true;
    webView.Settings.MediaPlaybackRequiresUserGesture = false; // Optional, enables auto-play if needed

    // Set the custom WebChromeClient
    webView.SetWebChromeClient(new CustomWebChromeClient(this));

    // Load your iframe content
    webView.LoadDataWithBaseURL("https://.", iFrameString, "text/html", "utf-8", null);
}

// Custom WebChromeClient to handle fullscreen
private class CustomWebChromeClient : WebChromeClient
{
    private readonly Activity _activity;

    public CustomWebChromeClient(Activity activity)
    {
        _activity = activity;
    }

    public override void OnShowCustomView(View view, CustomViewCallback callback)
    {
        base.OnShowCustomView(view, callback);

        // Avoid duplicate fullscreen views
        if ((_activity as YourActivityName)._fullscreenView != null)
        {
            callback.OnCustomViewHidden();
            return;
        }

        // Store references to the fullscreen view and callback
        (_activity as YourActivityName)._fullscreenView = view;
        (_activity as YourActivityName)._fullscreenCallback = callback;

        // Swap WebView with fullscreen video view
        (_activity as YourActivityName)._webViewContainer.RemoveAllViews();
        (_activity as YourActivityName)._webViewContainer.AddView(view);

        // Enable fullscreen window flags (hide status/navigation bars)
        _activity.Window.AddFlags(WindowManagerFlags.Fullscreen);
        _activity.Window.AddFlags(WindowManagerFlags.LayoutNoLimits);
        _activity.Window.ClearFlags(WindowManagerFlags.ForceNotFullscreen);
    }

    public override void OnHideCustomView()
    {
        base.OnHideCustomView();

        if ((_activity as YourActivityName)._fullscreenView == null)
            return;

        // Restore WebView and remove fullscreen view
        (_activity as YourActivityName)._fullscreenView.Visibility = ViewStates.Gone;
        (_activity as YourActivityName)._webViewContainer.RemoveView((_activity as YourActivityName)._fullscreenView);
        (_activity as YourActivityName)._webViewContainer.AddView((_activity as YourActivityName).FindViewById<WebView>(Resource.Id.webviewVideo));

        // Revert window flags to exit fullscreen
        _activity.Window.ClearFlags(WindowManagerFlags.Fullscreen);
        _activity.Window.ClearFlags(WindowManagerFlags.LayoutNoLimits);
        _activity.Window.AddFlags(WindowManagerFlags.ForceNotFullscreen);

        // Clean up references
        (_activity as YourActivityName)._fullscreenCallback.OnCustomViewHidden();
        (_activity as YourActivityName)._fullscreenView = null;
        (_activity as YourActivityName)._fullscreenCallback = null;
    }
}

If your app supports screen rotation, save the fullscreen state to avoid crashes. Add this to your Activity:

protected override void OnSaveInstanceState(Bundle outState)
{
    base.OnSaveInstanceState(outState);
    if (_fullscreenView != null)
    {
        outState.PutBoolean("isFullscreen", true);
    }
}

protected override void OnRestoreInstanceState(Bundle savedInstanceState)
{
    base.OnRestoreInstanceState(savedInstanceState);
    if (savedInstanceState != null && savedInstanceState.GetBoolean("isFullscreen"))
    {
        // Trigger fullscreen restoration if needed (adjust based on your video player)
    }
}

How It Works

When the iframe video's fullscreen button is clicked, OnShowCustomView swaps out the WebView with the video's fullscreen view and adjusts the window to be truly fullscreen. When the user exits fullscreen, OnHideCustomView reverts everything back to the original state.

Give this a try—this should resolve the fullscreen issue you're facing!

内容的提问来源于stack exchange,提问作者Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:48:27