2011-12-27 27 views
2

我試圖找出如何解決在網頁視圖的定位問題。基本上每次用戶改變設備的方向時,程序都變白並重新加載整個頁面。這需要很長時間。如何修復Android手機的webview的旋轉?

我想它那樣簡單地調整頁面大小以適合orientation.I've嘗試閱讀關於這個問題的其他文章所有其他程序運行,但是當我實現了他們的解決方案似乎沒有解決問題。

這是我目前的代碼。

package testdev.HelloWebApp; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.webkit.WebSettings; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

public class HelloWebAppActivity extends Activity { 
/** Called when the activity is first created. */ 
private WebView webView; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    webView = (WebView)findViewById(R.id.webView); 
    WebSettings webSettings =webView.getSettings(); 
    webSettings.setJavaScriptEnabled(true); 
    webView.setWebViewClient (new HelloWebViewClient()); 
    webView.loadUrl("http://google.com"); 

    if (savedInstanceState != null) 
     ((WebView)findViewById(R.id.webView)).restoreState(savedInstanceState); 

} 
private class HelloWebViewClient extends WebViewClient { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     view.loadUrl(url); 
     return true; 
    } 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) 
{ 
    if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) 
    { 
     webView.goBack(); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

@Override 
protected void onSaveInstanceState(Bundle outState){ 
    ((WebView) findViewById(R.id.webView)).saveState(outState); 
} 
} 

回答

1

當您旋轉設備時,Android restarts the application幫助重新加載正確的配置文件。有幾種方法可以解決這個問題。主要的兩個是保存應用程序的狀態,然後在配置更改後重新加載它,或者告訴Android不要爲了某些方向更改而重置應用程序。對於你的情況,我建議後者(因爲我沒有用WebView工作太多)。 Here's how.

添加到您的活動(一個或多個)清單,你不想重新啓動。

<活動機器人:名字= 「MyActivity。」 機器人:configChanges = 「方向」>

如果你想要的配置改變執行任何代碼,添加到您的活動的碼。

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

    // Do something here 
} 
+0

我試過了,但它似乎沒有做任何事情。 – 2011-12-27 03:14:44

4

我有同樣的問題。該webView的重新啓動,當你翻轉屏幕的原因(在我的情況下,至少)是你總是初始化webView的時候的onCreate()中運行,即使Webview是不爲空。

先加在你的AndroidManifest.xml如下:

<activity android:configChanges="orientation"> 

然後,嘗試添加一個if從句:

... 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    //Add this 
    if(webView == null){ 
     webView = (WebView)findViewById(R.id.webView); 
     WebSettings webSettings =webView.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 
     webView.setWebViewClient (new HelloWebViewClient()); 
     webView.loadUrl("http://google.com"); 
    } 

    if (savedInstanceState != null) 
     ((WebView)findViewById(R.id.webView)).restoreState(savedInstanceState); 
} 

... 
7

從Android 3.2開始(API等級13),在「屏幕尺寸「也會在設備在縱向和橫向之間切換時發生變化。因此,如果你想防止因方向改變運行時重新啓動了API等級13以上的開發時(以作爲的minSdkVersion聲明和targetSdkVersion屬性),您必須包括除「方向」值「屏幕尺寸」的價值。也就是說,你必須decalare

<activity android:configChanges="orientation|screenSize"> 

這裏的文檔:http://developer.android.com/guide/topics/resources/runtime-changes.html

1

這是2015年,很多人都在尋找仍然workds上傑利貝恩,KK和棒棒糖手機的解決方案。 後掙扎我找到了一種方法來保存網頁視圖完好你改變方向後。 我的策略基本上是將webview存儲在另一個類中的單獨靜態變量中。然後,如果發生旋轉,我將從該活動中分離出Web視圖,等待方向完成,然後重新將Web視圖重新附加到該活動。 例如...首先把這個在你的清單(keyboardHidden和鍵盤可選):

<application 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" 
     android:name="com.myapp.abc.app"> 

    <activity 
      android:name=".myRotatingActivity" 
      android:configChanges="keyboard|keyboardHidden|orientation"> 
    </activity> 

在一個單獨的應用程序類,放:

 public class app extends Application { 
      public static WebView webview; 
      public static FrameLayout webviewPlaceholder;//will hold the webview 

     @Override 
       public void onCreate() { 
        super.onCreate(); 
    //dont forget to put this on the manifest in order for this onCreate method to fire when the app starts: android:name="com.myapp.abc.app" 
        setFirstLaunch("true"); 
      } 

     public static String isFirstLaunch(Context appContext, String s) { 
      try { 
      SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext); 
      return prefs.getString("booting", "false"); 
      }catch (Exception e) { 
      return "false"; 
      } 
     } 

    public static void setFirstLaunch(Context aContext,String s) { 
     SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(aContext); 
      SharedPreferences.Editor editor = prefs.edit(); 
      editor.putString("booting", s); 
      editor.commit(); 
      } 
     } 

在活動中提出:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     if(app.isFirstLaunch.equals("true"))) { 
      app.setFirstLaunch("false"); 
      app.webview = new WebView(thisActivity); 
      initWebUI("www.mypage.url"); 
     } 
} 
@Override 
    public void onRestoreInstanceState(Bundle savedInstanceState) { 
     restoreWebview(); 
    } 

public void restoreWebview(){ 
     app.webviewPlaceholder = (FrameLayout)thisActivity.findViewById(R.id.webviewplaceholder); 
     if(app.webviewPlaceholder.getParent()!=null&&((ViewGroup)app.webview.getParent())!=null) { 
      ((ViewGroup) app.webview.getParent()).removeView(app.webview); 
     } 
     RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT, RelativeLayout.LayoutParams.FILL_PARENT); 
     app.webview.setLayoutParams(params); 
     app.webviewPlaceholder.addView(app.webview); 
     app.needToRestoreWebview=false; 
    } 

protected static void initWebUI(String url){ 
     if(app.webviewPlaceholder==null); 
      app.webviewPlaceholder = (FrameLayout)thisActivity.findViewById(R.id.webviewplaceholder); 
     app.webview.getSettings().setJavaScriptEnabled(true);  app.webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
     app.webview.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT)); 
     app.webview.getSettings().setSupportZoom(false); 
     app.webview.getSettings().setBuiltInZoomControls(true); 
     app.webview.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY); 
     app.webview.setScrollbarFadingEnabled(true); 
     app.webview.getSettings().setLoadsImagesAutomatically(true); 
     app.webview.loadUrl(url); 
     app.webview.setWebViewClient(new WebViewClient()); 
     if((app.webview.getParent()!=null)){//&&(app.getBooting(thisActivity).equals("true"))) { 
      ((ViewGroup) app.webview.getParent()).removeView(app.webview); 
     } 
     app.webviewPlaceholder.addView(app.webview); 
    } 

最後,簡單的XML:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".myRotatingActivity"> 
    <FrameLayout 
     android:id="@+id/webviewplaceholder" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 
</RelativeLayout> 

在我的解決方案中有幾件事情可以改進,但我已經花費了很多時間,例如:驗證活動是否第一次啓動而不是使用SharedPreferences存儲的較短方法。 此方法保留了webview完整(afaik),其文本框,標籤,UI,JavaScript變量以及未反映到URL的導航狀態。