我正在尝试使用 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;
}
最佳答案
请尝试此代码!我已经实现了 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);
}
}
}
关于java - 想要通过单击而不是两次单击来打开我的 android webview 网站内的横向链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51644776/