【问题标题】:Want to open landscape links inside my android webview website by single click instead of two clicks想要通过单击而不是单击两次在我的 android webview 网站中打开横向链接
【发布时间】:2019-01-09 16:52:45
【问题描述】:

我正在尝试使用 webview 从我的网站制作一个 android 应用程序,这样我希望我的网站中的某些链接以横向模式打开,而其他链接在我的 webview 中以纵向模式打开。为此,我在重写的函数 shouldOverrideUrlLoading 中实现了下面的代码,该函数完成了工作,但没有达到标准。这段代码的作用是,在第一次单击横向链接时,它将当前页面的方向更改为横向模式,但不会转到网站链接,如果我在当前页面已经处于横向模式时再次单击它,然后以横向模式转到网站链接。这确实有效,但非常烦人,因为链接位置在横向模式下会发生变化,用户将不得不通过滚动再次搜索链接,如果用户第二次点击纵向模式链接,当前页面将变为纵向模式但不会转到网站链接。简而言之,活动由于方向变化而重新启动,但奇怪的是,无论 loadUrl 和 setRequestedOrientation 函数的顺序如何,这种情况都会发生,并且在 setRequestedOrientation 之前或之后放置睡眠(比如 5 秒)没有区别,在任何一种情况下它都会睡眠(比如 5 秒)首先然后在第一次点击和第二次点击时改变方向,它首先休眠(比如 5 秒)然后加载 url 链接,我无法理解这种奇怪行为背后的原因(同样的感觉量子力学科学家所经历的)。我已经尝试了所有方法,例如在 AndroidManifest 文件中给出以下代码:

 android:configChanges="keyboard|keyboardHidden|orientation|screenSize"

还尝试在 MainActivity 文件中覆盖以下函数:

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

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

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

请专家帮助解决这种仅在第一次点击时发生的方向变化。

 @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {


              view.loadUrl(url);


              /*  try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }*/

                if(url.contains("<<some keywords>>")){
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
                }
                else{
                    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                }



        return true;
    }

【问题讨论】:

  • 你试过onPageFinished方法吗?尝试在此方法中设置方向
  • 是的@Basiljose,我尝试在 onPageFinished 和 onLoadResources 中设置方向,但是在这两种情况下,它只保留在当前页面上,然后旋转到横向模式,然后再旋转到纵向模式,无论您点击多少次链接。

标签: java android android-studio webview screen-orientation


【解决方案1】:

请试试这个代码!我已经实现了shouldOverrideUrlLoading,onPageStarted,onPageFinished。如果满足任何条件,屏幕方向会在onPageStarted 中更改。

public class WebViewActivity extends AppCompatActivity
{
private WebView mywebView;
private ProgressBar myprogressBar;
private static final String TAG = "WebViewActivity";

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

    myprogressBar = findViewById(R.id.myProgressBar);
    myprogressBar.setVisibility(View.GONE);

    mywebView = findViewById(R.id.myWebView);
    mywebView.getSettings().setLoadsImagesAutomatically(true);
    mywebView.getSettings().setJavaScriptEnabled(true);
    mywebView.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
    mywebView.setWebViewClient(new MyBrowser());
    mywebView.loadUrl("https://stackoverflow.com/");


}

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

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

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

private class MyBrowser extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        Log.d(TAG, "shouldOverrideUrlLoading: loading ");
        myprogressBar.setVisibility(View.VISIBLE);
        view.loadUrl(url);
        return true;
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) 
    {
        Log.d(TAG, "onPageStarted: started");
        myprogressBar.setVisibility(View.VISIBLE);
        /*
            here you have to include the your keywords instead of tags [hardcoded string]
         */
        if (url.contains("tags")) {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        } else {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        }
        super.onPageStarted(view, url, favicon);
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        myprogressBar.setVisibility(View.GONE);
        Log.d(TAG, "onPageFinished: finished");
        super.onPageFinished(view, url);
    }
 }
}

【讨论】:

  • 嗨@Basiljose,您的代码工作得非常好,但只是每个链接的第一次。如果我关闭并打开我的应用程序,它会回到亭子并保持在与之前相同的当前网站上,并以一种奇怪的方式继续改变方向。如果我清除应用程序数据,那么它会再次按预期工作,但对于每个链接都是第一次。但是,我必须说,这是一项很好的努力,感谢您的宝贵时间。
  • 此外,此代码发生的另一个问题是,在更改为横向模式后,屏幕的右侧部分从中间被修剪成全黑几秒钟,然后又回来了到正常景观。这会在更改为横向模式后每隔 30 到 60 秒发生一次。
  • 你能分享你做的代码[更新问题],包括网址,所以我可以帮助你更多
  • 抱歉,由于公司政策,无法分享网址。但我可以告诉你,我们有横向链接的视频。
  • 好吧,让我尝试任何视频列表网址并检查问题是否仍然存在
猜你喜欢
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多