ปัญหาคือประสิทธิภาพการหมุนตาม WebView จะต้องโหลดหน้าซ้ำซึ่งอาจเป็นเรื่องน่าเบื่อ
วิธีที่ดีที่สุดในการจัดการการเปลี่ยนแปลงการวางแนวโดยไม่ต้องโหลดหน้าซ้ำจากแหล่งที่มาในแต่ละครั้งคืออะไร
ปัญหาคือประสิทธิภาพการหมุนตาม WebView จะต้องโหลดหน้าซ้ำซึ่งอาจเป็นเรื่องน่าเบื่อ
วิธีที่ดีที่สุดในการจัดการการเปลี่ยนแปลงการวางแนวโดยไม่ต้องโหลดหน้าซ้ำจากแหล่งที่มาในแต่ละครั้งคืออะไร
คำตอบ:
หากคุณไม่ต้องการให้ WebView โหลดการเปลี่ยนแปลงการวางแนวใหม่ก็ให้แทนที่ onConfigurationChanged ในคลาสกิจกรรมของคุณ:
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
}
และตั้งค่าคุณสมบัติ android: configChanges ในไฟล์ Manifest:
<activity android:name="..."
android:label="@string/appName"
android:configChanges="orientation|screenSize"
สำหรับข้อมูลเพิ่มเติมดู:
http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange
https://developer.android.com/reference/android/app/Activity.html#ConfigurationChanges
configChanges
แอตทริบิวต์ได้รับเพิ่มไป subclass กิจกรรมที่ 2) ถ้า app ของคุณขึ้นอยู่กับหลายโครงการที่configChanges
แอตทริบิวต์ได้รับเพิ่มไปที่ประจักษ์ของหนึ่งที่ ด้านบนของแผนภูมิการพึ่งพา (ซึ่งอาจไม่ใช่โครงการที่มีคลาสกิจกรรม)
onConfigurationChanged
วิธีการแทนที่ดังกล่าวไม่มีประโยชน์
แก้ไข: วิธีนี้ใช้ไม่ได้อีกต่อไปตามที่ระบุในเอกสาร
คำตอบเดิม:
สิ่งนี้สามารถจัดการได้โดยการเขียนทับonSaveInstanceState(Bundle outState)
ในกิจกรรมของคุณและโทรsaveState
จาก webview:
protected void onSaveInstanceState(Bundle outState) {
webView.saveState(outState);
}
จากนั้นกู้คืนสิ่งนี้ใน onCreate ของคุณหลังจากที่ webview มีการพองตัวซ้ำอีกครั้งแน่นอน:
public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.blah);
if (savedInstanceState != null)
((WebView)findViewById(R.id.webview)).restoreState(savedInstanceState);
}
คำตอบที่ดีที่สุดสำหรับการทำตามเอกสาร Android พบที่นี่ โดยทั่วไปจะป้องกัน Webview จากการโหลดซ้ำ:
<activity android:name=".MyActivity"
android:configChanges="keyboardHidden|orientation|screenSize|layoutDirection|uiMode"
android:label="@string/app_name">
เลือกที่คุณสามารถแก้ไขความผิดปกติ (ถ้ามี) โดยเอาชนะonConfigurationChanged
ในกิจกรรม:
@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();
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
}
}
ฉันได้ลองใช้onRetainNonConfigurationInstance (คืนค่าWebView ) จากนั้นรับกลับมาพร้อมกับgetLastNonConfigurationInstanceระหว่างonCreateและกำหนดใหม่
ดูเหมือนจะยังใช้งานไม่ได้ ฉันช่วยไม่ได้ แต่คิดว่าฉันสนิทจริงๆ! จนถึงตอนนี้ฉันเพิ่งได้รับWebViewพื้นหลังสีขาว / เปล่าแทน การโพสต์ที่นี่ด้วยความหวังว่าบางคนสามารถช่วยผลักดันสิ่งนี้ผ่านเส้นชัย
บางทีฉันอาจจะไม่ควรผ่านWebView อาจเป็นวัตถุจากภายในWebViewหรือไม่?
วิธีอื่นที่ฉันได้ลอง - ไม่ใช่สิ่งที่ฉันโปรดปราน - คือการตั้งค่านี้ในกิจกรรม:
android:configChanges="keyboardHidden|orientation"
... จากนั้นก็ไม่ทำอะไรเลยที่นี่:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// We do nothing here. We're only handling this to keep orientation
// or keyboard hiding from causing the WebView activity to restart.
}
ใช้งานได้ แต่อาจไม่ถือว่าเป็นแนวปฏิบัติที่ดีที่สุดการปฏิบัติที่ดีที่สุด
ในขณะเดียวกันฉันยังมีImageViewเดียวที่ฉันต้องการอัปเดตอัตโนมัติขึ้นอยู่กับการหมุน สิ่งนี้กลายเป็นเรื่องง่ายมาก ภายใต้res
โฟลเดอร์ของฉันฉันมีdrawable-land
และdrawable-port
ถือรูปแบบแนวนอน / แนวตั้งจากนั้นฉันใช้R.drawable.myimagename
สำหรับImageViewแหล่งที่มาของและ Android "ทำในสิ่งที่ถูกต้อง" - ใช่!
... ยกเว้นเมื่อคุณดูการเปลี่ยนแปลงการกำหนดค่ามันจะไม่เกิดขึ้น :(
ดังนั้นฉันอยู่ที่อัตราต่อรอง ใช้onRetainNonConfigurationInstanceและการหมุนImageViewทำงานได้ แต่การคงอยู่ของWebViewไม่ได้ ... หรือใช้onConfigurationChangedและWebViewยังคงอยู่ แต่ImageViewไม่อัปเดต จะทำอย่างไร?
หมายเหตุสุดท้ายหนึ่ง: ในกรณีของฉันการบังคับให้วางแนวไม่ใช่การประนีประนอมที่ยอมรับได้ เราต้องการสนับสนุนการหมุนเวียนอย่างแท้จริง ค่อนข้างชอบวิธีที่แอพ Android Browser ทำ! ;)
วิธีที่ดีที่สุดในการจัดการการเปลี่ยนแปลงการวางแนวและการป้องกันไม่ให้โหลด WebView บน Rotate
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
}
โดยที่ในใจเพื่อป้องกัน onCreate () จากการถูกเรียกทุกครั้งที่คุณเปลี่ยนการวางแนวคุณจะต้องเพิ่ม android:configChanges="orientation|screenSize" to the AndroidManifest.
หรือเพียงแค่ ..
android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"`
เพียงแค่เขียนบรรทัดโค้ดต่อไปนี้ในไฟล์ Manifest ของคุณไม่มีอะไรอื่น มันได้ผลจริง:
<activity android:name=".YourActivity"
android:configChanges="orientation|screenSize"
android:label="@string/application_name">
ฉันขอขอบคุณที่นี่สายไปหน่อย แต่นี่เป็นคำตอบที่ฉันใช้เมื่อพัฒนาโซลูชัน:
AndroidManifest.xml
<activity
android:name=".WebClient"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize" <--- "screenSize" important
android:label="@string/title_activity_web_client" >
</activity>
WebClient.java
public class WebClient extends Activity {
protected FrameLayout webViewPlaceholder;
protected WebView webView;
private String WEBCLIENT_URL;
private String WEBCLIENT_TITLE;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_client);
initUI();
}
@SuppressLint("SetJavaScriptEnabled")
protected void initUI(){
// Retrieve UI elements
webViewPlaceholder = ((FrameLayout)findViewById(R.id.webViewPlaceholder));
// Initialize the WebView if necessary
if (webView == null)
{
// Create the webview
webView = new WebView(this);
webView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
webView.getSettings().setSupportZoom(true);
webView.getSettings().setBuiltInZoomControls(true);
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
webView.setScrollbarFadingEnabled(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setPluginState(android.webkit.WebSettings.PluginState.ON);
webView.getSettings().setLoadsImagesAutomatically(true);
// Load the URLs inside the WebView, not in the external web browser
webView.setWebViewClient(new SetWebClient());
webView.setWebChromeClient(new WebChromeClient());
// Load a page
webView.loadUrl(WEBCLIENT_URL);
}
// Attach the WebView to its placeholder
webViewPlaceholder.addView(webView);
}
private class SetWebClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.web_client, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}else if(id == android.R.id.home){
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onBackPressed() {
if (webView.canGoBack()) {
webView.goBack();
return;
}
// Otherwise defer to system default behavior.
super.onBackPressed();
}
@Override
public void onConfigurationChanged(Configuration newConfig){
if (webView != null){
// Remove the WebView from the old placeholder
webViewPlaceholder.removeView(webView);
}
super.onConfigurationChanged(newConfig);
// Load the layout resource for the new configuration
setContentView(R.layout.activity_web_client);
// Reinitialize the UI
initUI();
}
@Override
protected void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
// Save the state of the WebView
webView.saveState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState){
super.onRestoreInstanceState(savedInstanceState);
// Restore the state of the WebView
webView.restoreState(savedInstanceState);
}
}
คุณสามารถลองใช้onSaveInstanceState()
และonRestoreInstanceState()
บนกิจกรรมของคุณเพื่อโทรsaveState(...)
และrestoreState(...)
บนอินสแตนซ์ WebView ของคุณ
มันคือปี 2015 และหลายคนกำลังมองหาทางออกที่ยังคงใช้งานได้กับโทรศัพท์ Jellybean, KK และ Lollipop หลังจากนั้นมากดิ้นรนฉันพบวิธีที่จะรักษาหน้าเว็บให้ไม่เปลี่ยนแปลงหลังจากที่คุณเปลี่ยนการวางแนว กลยุทธ์ของฉันใช้เพื่อจัดเก็บ webview ในตัวแปรคงที่แยกต่างหากในคลาสอื่น จากนั้นหากการหมุนเกิดขึ้นฉันกำหนดมุมมองเว็บใหม่จากกิจกรรมรอให้การวางแนวเสร็จสิ้นและแนบมุมมองเว็บกลับไปที่กิจกรรมอีกครั้ง ตัวอย่างเช่น ... วางสิ่งนี้ไว้บน MANIFEST ของคุณ (keyboardHidden และ keyboard เป็นทางเลือก):
<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>
ในคลาสแอปพลิเคชัน SEPARATE ให้ป้อน:
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 วิธีการนี้จะช่วยให้คุณรักษาสภาพการดูเว็บให้เหมือนเดิม (afaik), กล่องข้อความ, ป้ายกำกับ, UI, ตัวแปรจาวาสคริปต์และสถานะการนำทางที่ไม่ได้สะท้อนจาก URL
สิ่งเดียวที่คุณควรทำคือการเพิ่มรหัสนี้ลงในไฟล์รายการของคุณ:
<activity android:name=".YourActivity"
android:configChanges="orientation|screenSize"
android:label="@string/application_name">
อัปเดต: กลยุทธ์ปัจจุบันคือการย้ายอินสแตนซ์ WebView ไปยังคลาสแอปพลิเคชันแทนที่จะเป็นชิ้นส่วนที่เก็บไว้เมื่อถูกแยกออกและดำเนินการต่อตามที่ Josh ทำ เพื่อป้องกันการปิดแอปพลิเคชันคุณควรใช้บริการเบื้องหน้าหากคุณต้องการรักษาสถานะเมื่อผู้ใช้สลับระหว่างแอปพลิเคชัน
หากคุณใช้แฟรกเมนต์คุณสามารถใช้เก็บอินสแตนซ์ของ WebView มุมมองเว็บจะถูกเก็บไว้ในฐานะสมาชิกอินสแตนซ์ของคลาส อย่างไรก็ตามคุณควรแนบมุมมองเว็บใน OnCreateView และแยกออกก่อน OnDestroyView เพื่อป้องกันไม่ให้ทำลายด้วยคอนเทนเนอร์หลัก
class MyFragment extends Fragment{
public MyFragment(){ setRetainInstance(true); }
private WebView webView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = ....
LinearLayout ll = (LinearLayout)v.findViewById(...);
if (webView == null) {
webView = new WebView(getActivity().getApplicationContext());
}
ll.removeAllViews();
ll.addView(webView, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
return v;
}
@Override
public void onDestroyView() {
if (getRetainInstance() && webView.getParent() instanceof ViewGroup) {
((ViewGroup) webView.getParent()).removeView(webView);
}
super.onDestroyView();
}
}
เครดิต PS ไปที่คำตอบ kcoppock
สำหรับ 'SaveState ()' มันไม่ทำงานตามเอกสารทางการ :
โปรดทราบว่าวิธีนี้จะไม่เก็บข้อมูลการแสดงผลสำหรับ WebView นี้อีกต่อไป พฤติกรรมก่อนหน้านี้อาจรั่วไฟล์ถ้า restoreState (Bundle) ไม่เคยถูกเรียก
setRetainInstance
รักษาส่วนย่อยไว้มุมมอง (และ WebView) จะยังคงถูกทำลาย
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
}
วิธีการเหล่านี้สามารถถูกแทนที่ในกิจกรรมใด ๆ เพียงแค่ช่วยให้คุณสามารถบันทึกและคืนค่าในแต่ละครั้งที่กิจกรรมถูกสร้าง / ทำลายเมื่อการวางแนวหน้าจอเปลี่ยนกิจกรรมที่ถูกทำลายและสร้างขึ้นใหม่ในพื้นหลังดังนั้นคุณจึงสามารถใช้วิธีการเหล่านี้ ไปที่สถานะร้านค้า / คืนสถานะชั่วคราวในระหว่างการเปลี่ยนแปลง
คุณควรมองลึกลงไปในสองวิธีต่อไปนี้และดูว่ามันเหมาะกับการแก้ปัญหาของคุณหรือไม่
http://developer.android.com/reference/android/app/Activity.html
ทางออกที่ดีที่สุดที่ฉันได้พบการทำเช่นนี้โดยไม่รั่วไหลการActivity
อ้างอิงก่อนหน้าและโดยไม่ต้องตั้งค่าconfigChanges
.. คือการใช้MutableContextWrapper MutableContextWrapper
ฉันได้ใช้สิ่งนี้ที่นี่: https://github.com/slightfoot/android-web-wrapper/blob/48cb3c48c457d889fc16b4e3eba1c9e925f42cfb/WebWrapper/src/com/example/webwrapper/BrowserActivity.js
นี่เป็นสิ่งเดียวที่ทำงานได้สำหรับฉัน (ฉันยังใช้สถานะอินสแตนซ์บันทึกในonCreateView
แต่ไม่น่าเชื่อถือ)
public class WebViewFragment extends Fragment
{
private enum WebViewStateHolder
{
INSTANCE;
private Bundle bundle;
public void saveWebViewState(WebView webView)
{
bundle = new Bundle();
webView.saveState(bundle);
}
public Bundle getBundle()
{
return bundle;
}
}
@Override
public void onPause()
{
WebViewStateHolder.INSTANCE.saveWebViewState(myWebView);
super.onPause();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
ButterKnife.inject(this, rootView);
if(WebViewStateHolder.INSTANCE.getBundle() == null)
{
StringBuilder stringBuilder = new StringBuilder();
BufferedReader br = null;
try
{
br = new BufferedReader(new InputStreamReader(getActivity().getAssets().open("start.html")));
String line = null;
while((line = br.readLine()) != null)
{
stringBuilder.append(line);
}
}
catch(IOException e)
{
Log.d(getClass().getName(), "Failed reading HTML.", e);
}
finally
{
if(br != null)
{
try
{
br.close();
}
catch(IOException e)
{
Log.d(getClass().getName(), "Kappa", e);
}
}
}
myWebView
.loadDataWithBaseURL("file:///android_asset/", stringBuilder.toString(), "text/html", "utf-8", null);
}
else
{
myWebView.restoreState(WebViewStateHolder.INSTANCE.getBundle());
}
return rootView;
}
}
ฉันทำเจ้าของ Singleton สำหรับสถานะของ WebView สถานะจะถูกเก็บรักษาไว้ตราบเท่าที่กระบวนการของแอปพลิเคชันมีอยู่
แก้ไข: ที่loadDataWithBaseURL
ไม่จำเป็นมันทำงานได้ดีเช่นกันกับเพียงแค่
//in onCreate() for Activity, or in onCreateView() for Fragment
if(WebViewStateHolder.INSTANCE.getBundle() == null) {
webView.loadUrl("file:///android_asset/html/merged.html");
} else {
webView.restoreState(WebViewStateHolder.INSTANCE.getBundle());
}
แม้ว่าฉันจะอ่านมันไม่ได้ทำงานได้ดีกับคุกกี้
ลองนี้
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends AppCompatActivity {
private WebView wv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
wv = (WebView) findViewById(R.id.webView);
String url = "https://www.google.ps/";
if (savedInstanceState != null)
wv.restoreState(savedInstanceState);
else {
wv.setWebViewClient(new MyBrowser());
wv.getSettings().setLoadsImagesAutomatically(true);
wv.getSettings().setJavaScriptEnabled(true);
wv.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
wv.loadUrl(url);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
wv.saveState(outState);
}
@Override
public void onBackPressed() {
if (wv.canGoBack())
wv.goBack();
else
super.onBackPressed();
}
private class MyBrowser extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
}
หน้านี้แก้ปัญหาของฉัน แต่ฉันต้องทำการเปลี่ยนแปลงเล็กน้อยในครั้งแรก:
protected void onSaveInstanceState(Bundle outState) {
webView.saveState(outState);
}
ส่วนนี้มีปัญหาเล็กน้อยสำหรับฉันในเรื่องนี้ ในการวางแนวที่สองเปลี่ยนแอปพลิเคชันที่ยกเลิกด้วยตัวชี้โมฆะ
ใช้มันทำงานได้สำหรับฉัน:
@Override
protected void onSaveInstanceState(Bundle outState ){
((WebView) findViewById(R.id.webview)).saveState(outState);
}
คุณควรลองสิ่งนี้:
onServiceConnected
วิธีรับ WebView และเรียกsetContentView
วิธีการแสดง WebView ของคุณฉันทดสอบแล้วและใช้งานได้ แต่ไม่ใช่กับ WebViews อื่น ๆ เช่น XWalkView หรือ GeckoView
@Override
protected void onSaveInstanceState(Bundle outState )
{
super.onSaveInstanceState(outState);
webView.saveState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
super.onRestoreInstanceState(savedInstanceState);
webView.restoreState(savedInstanceState);
}
ฉันชอบวิธีนี้ http://www.devahead.com/blog/2012/01/preserving-the-state-of-an-android-webview-on-screen-orientation-change/
จากนั้นเราจะใช้อินสแตนซ์เดียวกันของ WebView อีกครั้ง อนุญาตให้บันทึกประวัติการนำทางและตำแหน่งการเลื่อนเมื่อเปลี่ยนแปลงการกำหนดค่า