java - 想要通过单击而不是两次单击来打开我的 android webview 网站内的横向链接

标签 java android android-studio webview screen-orientation

我正在尝试使用 webview 从我的网站制作一个 android 应用程序,这样我希望我的网站中的某些链接以横向模式打开,而其他链接在我的 webview 中以纵向模式打开。为此,我在重写的函数 shouldOverrideUrlLoading 中实现了以下代码,该函数可以完成工作,但没有达到要求。此代码的作用是,第一次单击横向链接时,它将当前页面的方向更改为横向模式,但不会转到网站链接,如果我在当前页面已经处于横向模式时第二次单击它,然后以横向模式转到网站链接。这确实有效,但非常令人恼火,因为链接位置在横向模式下发生了变化,用户将不得不通过滚动再次搜索链接,如果用户第二次单击纵向模式链接,当前页面将变成纵向模式但不转到网站链接。简而言之, Activity 由于方向更改而重新启动,但奇怪的是,无论 loadUrl 和 setRequestedOrientation 函数的顺序如何,都会发生这种情况,并且在 setRequestedOrientation 之前或之后放置 sleep (例如 5 秒)没有区别,在任何一种情况下它都会 hibernate (比如说 5 秒),然后在第一次单击和第二次单击时更改方向,它首先 hibernate (比如说 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;
    }

最佳答案

请尝试此代码!我已经实现了 shouldOverrideUrlLoadingonPageStartedonPageFinished 。如果满足任何条件,则屏幕方向会在 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);
    }
 }
}

关于java - 想要通过单击而不是两次单击来打开我的 android webview 网站内的横向链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51644776/

相关文章:

java - 将 Vector 元素从一个类更改为另一类

java - 要求 'java' 在 irb 中失败

java - 在 ExtJS 中显示

android - NestedScrollView 的 smoothScrollTo() 行为怪异

android-studio - 在后台服务中隐藏导航栏 - android

java - 无法在 run() 中将 swing 组件放到框架上?

java - JNI - 从 C++ Vector 实例化 Java ArrayList

android - 通过 Android Media Store 将图像存储在新文件夹中

android - Android Studio 中的模拟器无法启动

java - 在 button.setonclick 监听器中抛出空指针异常