WebView在屏幕方向改变时无法正确调整大小

5
我正在使用webview.loadUrl()将视频网址加载��webview中。播放器已经在html中编码,所以我只需要将网址加载到webview中即可。
如果我在清单中不提供android:configChanges="orientation",那么一切都正常。 webview能够在方向更改时调整大小,并且视频适合屏幕大小。当然,这样会导致视频重新开始。
因此,我在清单中提供了android:configChanges="orientation",以便视频不重新加载。现在虽然视频不重新加载并继续播放,但视频/webview无法正确调整大小,如果设备最初是竖屏的,然后转换为横屏,则视频的一半会超出屏幕。如果设备最初是横屏的,然后转换为竖屏,则只使用屏幕的一半。
如果您有任何建议或想找到解决方法,请回复我。
7个回答

3

*如果未指定configchanges =“orientation”

Android系统会处理更改并重新启动布局,因此布局将被重新创建并从头开始加载视频。

如果android:configchanges =“orientation”,- 这告诉系统此活动将自行处理方向更改。 因此,Android系统不会刷新布局。因此,视频继续播放。父布局的宽度不会更改。因此,纵向模式下的宽度在横向模式下使用。因此,您的Web视图似乎较小。

您需要在活动中重写onconfigurationchanged()并处理方向更改。 您需要为布局指定layoutparams。

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        // Checks the orientation of the screen
        if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show();
            // for example the width of a layout  
            int width = 300;
            int height = LayoutParams.WRAP_CONTENT;
            WebView childLayout = (WebView) findViewById(R.id.webview);
            childLayout.setLayoutParams(new LayoutParams(width, height));
        } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
            Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
        }
    }

新的LayoutParams(width, height)在API级别低于11的情况下不起作用。因此,我尝试对WebView以及我放置WebView的布局使用LinearLayout.LayoutParams(width, height),但问题仍然存在。 - user2041902
@sowmia 如果你因为无法评论而无法沟通,请发送邮件到我的Gmail ID praveen.3490@gmail.com - pvn
请发布layout xml和onConfigurationChanged方法。我会尝试找出问题所在。您还可以参考https://dev59.com/pXNA5IYBdhLWcg3wVcT6?rq=1。 - Sowmia Sundararajan

1

尝试:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    webView.setLayoutParams(new RelativeLayout.LayoutParams(
                      ViewGroup.LayoutParams.WRAP_CONTENT,
                      ViewGroup.LayoutParams.WRAP_CONTENT));
}

这对我没用,改变方向后,应用程序会崩溃成屏幕顶部的窄条。应用程序仍在运行,当我切换回来时,条带重新定位但仍保持为条带。顺便说一下,对于那些想尝试它的人,您还需要:- import android.content.res.Configuration; import android.view.ViewGroup; import android.widget.RelativeLayout; - Mark Kortink

0
只需在清单文件中的活动中添加以下行:
<activity android:configChanges="orientation|screenSize">

这不起作用,我已经在我的应用程序中使用了它,但仍然存在问题。 - Mark Kortink

0

我的答案与上面的非常相似,与@Arash Sharif最接近。这是适用于我个人的变体。

背景:我的应用程序是一个Web应用程序,仅使用HTML、CSS和JavaScript。我通过将其包装在WebView控件中来在Android上运行它作为应用程序。该应用程序旨在全屏运行,需要在屏幕重新定位时调整大小。

我在Android Studio工作。我既不是Android也不是Java程序员,因此我的解释可能不是正确的术语,但我相信它是有效的。

首先,您需要告诉Android您将处理屏幕事件。

AndoidManifest.xml

        android:configChanges="orientation|screenSize|screenLayout|keyboardHidden">
        <activity android:name="com.babyclix.babyclix_test.MainActivity"
            android:configChanges="orientation|screenSize|screenLayout|keyboardHidden">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

现在,Android将传递屏幕事件给您处理,因此您需要覆盖处理屏幕事件的函数。

MainActivity.java

// For screen handling on changes (eg. reorientation, resizing)
import android.content.res.Configuration;
import android.view.ViewGroup;
import android.widget.RelativeLayout;

// your stuff

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        mywebview.setLayoutParams(new RelativeLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT));
    }

// more stuff


0
在片段中,您必须使用FrameLayout来放置WebView。
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    int width = FrameLayout.LayoutParams.MATCH_PARENT;
    int height = FrameLayout.LayoutParams.WRAP_CONTENT;
    your_webview.setLayoutParams(new FrameLayout.LayoutParams(width, height));
}

这对我没用,改变方向后应用程序消失了,我被扔到主屏幕。应用程序仍在运行,当我切换到它时,它被裁剪了。顺便说一句,对于那些想尝试的人,您还需要:- import android.content.res.Configuration; import android.widget.FrameLayout; - Mark Kortink

0
据我所见,H5页面中一定存在某些错误,类似的缩放问题
只需使用其他应用程序(如Chrome浏览器)测试您的URL。

0

遇到了同样的问题,用最好的方法解决了它。

@Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        int height = displayMetrics.heightPixels;
        int width = displayMetrics.widthPixels;
        mWebview.setLayoutParams(new LinearLayout.LayoutParams(
                width,
                height-100));

    }

这对我没用,改变设备方向后应用程序消失了,我被扔到了主屏幕。应用程序仍在运行,当我切换回去时,它被裁剪了。顺便说一下,对于那些想要尝试的人,你还需要:- import android.content.res.Configuration; import android.util.DisplayMetrics; import android.widget.LinearLayout; - Mark Kortink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接