2013-02-21 73 views
3

編輯:tl; dr:WebView顯示爲白色框,即使我似乎正確設置了它,並且確實它在前兩次都能正常工作,但隨後失敗)WebView在第二次初始化後顯示爲純白色框

編輯:Video showing the problem in action...

我有膨脹從該定義它的XML視圖(其中包含一個web視圖)下面的代碼位:

private void createCard(ViewGroup cvFrame, Card card) { 

    //... setup vairables... 

    cvFrame.clearDisappearingChildren(); 
    cvFrame.clearAnimation(); 


    try { 
     View cv = LayoutInflater.from(getBaseContext()).inflate(R.layout.card_back_view, 
       cvFrame, true); 
     cv.setBackgroundDrawable(Drawable.createFromStream(mngr.open(deckName + "_Card_back.png"), deckName)); 

     TextView suit = (TextView)cv.findViewWithTag("card_back_suit"); 
     //...setup text view for suit, this code works fine every time... 

     WebView title = (WebView)cv.findViewWithTag("card_back_title"); 
     //This WebView doesn't appear to be the one which actually appears on screen (I can change settings till I'm blue in the face, with no effect) 
     if (title != null) { 
      title.setBackgroundColor(0x00000000); 
      title.loadData(titleText, "text/html", "UTF-8"); 
     } else { 
      Log.e("CardView", "Error can't find title WebView"); 
     } 
    } catch (IOException e) { 
     Log.e("CardView", "Error making cards: ", e); 
    } 
} 

當這個方法被稱爲作爲onCreate會議的一部分在我的Activity中,WebView包含正確的代碼,並且適當透明。

我有一個手勢監聽器,它用不同的內容替換ViewGroup的內容(它將頂部卡片向左移動,用卡片2替換頂部卡片的內容,放回頂部卡片,然後替換卡片2卡3)

//Gesture listener event 
ViewGroup cvFrame = (ViewGroup)findViewById(R.id.firstCard); 
cardLoc++ 
cvFrame.startAnimation(slideLeft); 

(onAnimationEnd代碼)

public void onAnimationEnd(Animation animation) { 
    if (animation == slideLeft) { 
     ViewGroup cvFrameOldFront = (ViewGroup)findViewById(R.id.firstCard); 
     ViewGroup cvFrameNewFront = (ViewGroup)findViewById(R.id.secondCard); 

     createCard(cvFrameOldFront, cards.get((cardLoc)%cards.size())); 
     createCard(cvFrameNewFront, cards.get((cardLoc+1)%cards.size())); 

     TranslateAnimation slideBack = new TranslateAnimation(0,0,0,0); 
     slideBack.setDuration(1); 
     slideBack.setFillAfter(true); 
     cvFrameOldFront.startAnimation(slideBack); 

    } 
} 

當動畫已經發生和我替換的牌的內容,TextView的suit被替換精細和代碼絕對通過穿過代碼t o替換WebView的內容,但由於某種原因,我最終得到了一個白色的矩形,表示WebView的大小和形狀,沒有內容,沒有透明度。

如果我改變的WebView到一個TextView,它的內容被替換細,所以它的出現只與WebView控件的一個問題:S

誰能告訴我爲什麼/提示修復?

+0

titleText中有什麼?我假設它的HTML代碼。 – JoxTraex 2013-02-25 08:31:52

+0

它只是簡單的HTML片段 - 它只需要富文本能力,如此粗體,斜體等。 – 2013-02-25 08:38:38

+0

如果您只需要使用簡單的標籤,爲什麼不使用像這樣的HTML的'TextView':'textView.setText (Html.fromHtml(「標題」)'?檢查[這篇文章](http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html)for (TextView)支持的HTML標籤列表 – 2013-02-25 09:17:57

回答

3

事實證明,當使用LayoutInflater替換ViewGroup的內容時,WebView不會被清除。其他控件似乎都被刪除(或至少findViewWithTag()返回每個其他控件的正確引用)。在LayoutInflater完成之前,我剛剛在cvFrame.removeAllViews()之間添加了一行,並解決了問題。 如果有人有任何更好的解釋,我會拋出他們的方式,否則他們會進入以太...

1

我有一個類似的問題,加載幾個WebViews的內容。 這是因爲pauseTimers函數被誤用

這種情況是:第一個webView不再需要了,我很想暫停它,然後才能釋放它。調用onPause()和pauseTimers()

pauseTimers對於任何Web視圖都很常見,它打破了之後出現的所有Web視圖的使用,只顯示白色矩形。

也許這裏不是你的問題,但值得檢查一下你不打電話WebView.pauseTimers()的地方。

1

通過調用findViewById,你得到了一個以前加載的webview的參考嗎?

因此失敗的loadData調用是您在單個webview實例上進行的第二次調用。

你可能要檢查: Android WebView - 1st LoadData() works fine, subsequent calls do not update display

看來,loadData()將不會加載數據的兩倍......你可能想嘗試WebView.loadDataWithBaseUri()

希望有所幫助。

+0

嗯,這似乎並不是這種情況,因爲你的膨脹調用應該在'cvFrame'viewGroup中創建新視圖。在調用'createCard'之前,您是否從此視圖組中刪除了「視圖」? – Guian 2013-02-28 14:05:08

1

要確認您的答案,LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)的源代碼實際上確實internally calls root.addView(),它將新膨脹的視圖附加到根子節點的末尾,而不是替換它們。

因此,現在的謎團是您爲什麼要致電findViewWithTag()爲您的其他小部件(這可能是頂級的,最近創建的實例)返回期望的對象,但是對於您的WebView,它返回了其他東西。

是否有可能您的佈局XML中有另一個對象共享相同的「card_back_title」標記?

我也想知道爲什麼你沒有使用更常見的findViewById()來代替,但我不確定它是否會有所作爲。

+0

我有多個相同視圖的實例。我想我不確定多個子視圖是否可以共享相同的ID,如果他們有不同的父視圖?所以我用標籤來代替(我想我正在考慮像HTML這樣的類和Ids這樣的標籤,不知道它是否有效) – 2013-03-04 09:52:24

相關問題