1. 程式人生 > >Activity中的fragment載入webview 出現空白

Activity中的fragment載入webview 出現空白

        在開發中遇到了載入fragment出現空白的問題,剛開始並沒有判斷出是因為裡面webview的原因。具體介面情況是在一個activity中有兩個fragment,然後點選對應的按鈕,切換fragment, fragment中的佈局有webview和其他按鈕。

        fragment的新增我使用了show 和hide因為我需要向fragment中傳送廣播,所以需要 fragment一直存在,replace的話,每replace一次便會重新走fragment的生命週期,可能會收不到廣播。所以在activity中onCreate方法中將兩個fragment初始化並添加了進去。

然後我在點選第二個按鈕,將第一個碎片hide(),第二個碎片show()之後,發現頁面是空白的,內容並沒有加載出來,以為是第二個fragemnt並沒有show,但是發現fragment中的佈局除了webview中的內容外,其他控制元件都出來了,因此判斷是webview加載出現了問題。

        在網上搜索之後,發現通常的解決方法有兩種,一是將最外層的linearLayout改為frameLayout,例如這種

使用FrameLayout代替LinearLayout,此時不會像android.R.id.content覆蓋掉原佈局的東西,而是根據FrameLayout所在layout進行佈局

  1. <
    FrameLayout
  2.         android:id="@+id/my_fragment"
  3.         android:layout_width="fill_parent"
  4.         android:layout_height="wrap_content"
  5. />

由於我的佈局中還有其他控制元件  並不只是一個webvie ,然後我在frameLayout中添加了一個LinearLayout,把控制元件加到了linearLayout中,執行之後發現,仍然未加載出來。

第二種的解決方式是  使用android.R.id.content,代替你的佈局id,也就是我們通常設定的setContentView()方法,具體的使用像這樣

使用android.R.id.content,代替你的佈局,我的是LinearLayout,但是使用android.R.id.content,Fragment會覆蓋原佈局的內容,此內容不會清除。

  1. getFragmentManager().beginTransaction().add(android.R.id.content,one,"qe").commit(); 

其中也提到了,使用之後會覆蓋你最開始佈局內容,因為是在根佈局上加的,所以會覆蓋最開始在  setContentView()中的內容,該方法對我也不適用。

        在使用fragment的hide()和show()方法時,會重走一個  onHiddenChanged()方法,既然webview沒有將我們需要的內容進行載入,那可以在重走onHiddenChanged()方法時讓webview重新載入內容,所以我是如下解決的:

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    
   if (hidden) {
    //寫需要的邏輯
    } else {
        if (dealChartBean.getyPoint() != null && dealChartBean.getyPoint().size() > 0) {
            //載入webview
mWebView.loadUrl("file:///android_asset/jsWeb/echarts.html");
mWebView.setWebViewClient(new WebViewClient() {
                @Override
public void onPageFinished(WebView view, String url) {
                    JSONObject obj = stringJSon.optJSONObject("option");
useJSMethod(obj);
                    super.onPageFinished(view, url);
}

                @Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    view.loadUrl(url);
                    return true;
}
            });
mWebView.setVisibility(View.VISIBLE);
mTVNoData.setVisibility(View.GONE);
}
    }
}

再次執行之後發現,可以加載出內容。在此記錄(ps 將截圖上傳部落格  釋出之後發現 截圖沒了,這是csdn的bug嗎???)