2013-02-21 36 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

相关问题