WebView使用postUrl保存和还原状态问题

时间:2018-08-02 12:26:45

标签: android android-webview android-orientation savestate

我正在应用程序中使用以下组件

  
      
  • 活动
  •   
  • 片段
  •   
  • WebView
  •   

目标-我不想在方向更改时重新加载网络视图。

问题-当前,我在方向更改上看到以下错误“网页不可用。https://fakeurls.org上的网页无法加载,因为net :: ERR_CACHE_MISS”

复制步骤

  • 应用程序以设备纵向模式打开。

  • 给定URL的内容已成功加载到Webview中

  • 设备已变为横向模式

  • Webview显示错误

代码-Android应用程序在Web视图中向网址https://fakeurls.org发送发布请求。下面是MyActivity和MyFragment类的代码

MyFragment.java

public class MyFragment extends Fragment {

    private ProgressBar mProgressBar;
    private WebView mWebView;
    private String mUrl = null;
    private String mPostData = null;

    public MyFragment() {
        // Required empty public constructor
    }

    public static MyFragment newInstance(@android.support.annotation.NonNull String url, String postData) {
        MyFragment MyFragment = new MyFragment();
        Bundle bundle = new Bundle();
        bundle.putString("URL", url);
        bundle.putString("POSTDATA", postData);
        MyFragment.setArguments(bundle);
        return MyFragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.my_fragment, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        instantiateWebView(view);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (savedInstanceState != null) {
            mWebView.restoreState(savedInstanceState);
        } else {
            Bundle args = getArguments();
            if (args == null) {
                return;
            }
            mUrl = args.getString("URL");
            mPostData = args.getString("POSTDATA");
            mWebView.postUrl("https://fakeurls.org/", EncodingUtils.getBytes(mPostData, "BASE64"));
        }
    }

    @Override
    public void onSaveInstanceState(final Bundle outState) {
        super.onSaveInstanceState(outState);
        if (mWebView != null) {
            mWebView.saveState(outState);
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mWebView.destroy();
    }

    private void instantiateWebView(View view) {
        mWebView = (WebView) view.findViewById(R.id.webView);
        mWebView.setWebViewClient(new WebViewClient());
        mWebView.getSettings().setJavaScriptEnabled(true);
    }
}

MyActivity.java

public class MyActivity extends AppCompatActivity {

    private MyFragment mMyFragment;

    @NonNull
    public static Intent createIntent(Context context, String url, String postData) {
        return new Intent(context, MyActivity.class).putExtra("URL", url)
        .putExtra("POSTDATA", postData);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_link_viewer);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        getSupportActionBar().setDisplayShowTitleEnabled(false);

        mMyFragment = (MyFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_frame);
        if (mMyFragment == null) {
            final String url = getIntent().getStringExtra("URL");
            final String postData = getIntent().getStringExtra("POSTDATA");
            mMyFragment = MyFragment.newInstance(url, postData);
            getSupportFragmentManager()
                    .beginTransaction()
                    .add(R.id.fragment_frame, mMyFragment)
                    .commitNow();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    public void finish() {
        mMyFragment.cancelTasks();
        super.finish();
    }
}

请让我知道如何解决该问题,而不是重新加载Webview,而是保留方向更改时的显示。任何帮助表示赞赏。

0 个答案:

没有答案