首页 > 解决方案 > 如何在方向更改的片段中保存 Web 视图状态?

问题描述

我使用 Java 中的 ViewModel 将 Web 视图状态保存在片段中。这样:

public class PageViewModel extends ViewModel {

    private MutableLiveData<CustomWebView> liveData = new MutableLiveData<>();
    public void setWebView(CustomWebView webView) {
        liveData.setValue(webView);
    }
    public LiveData<CustomWebView> getWebView() {
        return liveData;
    }
}

在Fragment 中的onCreate并保存当前的 web-view 状态:

pageViewModel = new ViewModelProvider(this).get(PageViewModel.class);
pageViewModel.setWebView((CustomWebView) view);

最后在 Fragment 中的 onConfigurationChanged 中:

 @Override
public void onConfigurationChanged(@NonNull Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    pageViewModel.getWebView().observe(requireActivity(), new Observer<CustomWebView>() {
        @Override
        public void onChanged(CustomWebView customWebView) {
            webView = customWebView;
        }
    });
}

因此,当方向改变时,网络视图不会重新加载。但是当我在 kotlin 中使用这种方式时,Webview 不保存状态并重新加载。

页面视图模型:

class PageViewModel : ViewModel() {

    val liveData = MutableLiveData<CustomWebView>()
    fun setWebView(webView: CustomWebView?) {
        liveData.value = webView
    }
    fun getWebView(): LiveData<CustomWebView?>? {
        return liveData
    }
}

在全局变量中:private lateinit var pageViewModel: PageViewModel和片段的 onCreate 方法中:

pageViewModel = ViewModelProvider(activity!!).get(PageViewModel::class.java)
pageViewModel.setWebView(view as CustomWebView)

最后在 Fragment 中的 onConfigurationChanged 中:

 pageViewModel.getWebView()?.observe(requireActivity(), Observer { customWebView ->
        if (customWebView != null) {
            webView = customWebView
        }
    })

你能帮助我吗?我哪里做错了?

标签: javaandroidandroid-fragmentskotlin

解决方案


你的方法很好,效果很好。我测试了您的代码,但在我的应用程序中,onConfigurationChanged没有运行。我搜索了这个问题并将这一行添加到清单中的活动标记中:

android:configChanges="orientation|screenSize"

然后 * onConfigurationChanged * 运行。


推荐阅读