WebView在第二次初始化后显示为空白框。

3

编辑:tl;dr:WebView显示为白框,尽管我似乎已经正确设置了它,实际上前两次它是可以工作的,但之后就会失败)

编辑:视频演示问题...

我有以下一小段代码,它从定义它的xml中填充视图(其中包含一个WebView):

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);
    }
}

当这个方法作为我的Activity的onCreate方法的一部分被调用时,WebView包含正确的代码,并且透明度适当。

我有一个手势监听器,它将ViewGroup的内容替换为不同的内容(它将顶部卡片向左移动,用卡片2替换顶部卡片的内容,将顶部卡片放回,然后用卡片3替换卡片2)。

//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 被成功替换,代码肯定通过了替换 WebView 内容的代码,但出于某种原因,我最终得到了一个白色矩形,大小和 WebView 相同,没有内容,没有透明度。
如果我将 WebView 更改为 TextView,则其内容被成功替换,因此这只是在 WebView 控件上发生的问题:S
有人能告诉我原因/建议修复方法吗?

标题文本中包含什么?我假设它是HTML代码。 - JoxTraex
这只是简单的HTML片段 - 它只需要具备富文本功能,如加粗、斜体等。 - Matt Fellows
如果您只需要使用简单的标签,为什么不像这样使用带有HTML的TextViewtextView.setText(Html.fromHtml("<b>Title</b>")?请查看此文章以获取TextView支持的HTML标签列表。 - Dheeraj Vepakomma
TextView 可以滚动吗?如果可以的话,那看起来是个好主意(虽然我现在已经解决了我的问题,但这仍然是一个更好的计划)。 - Matt Fellows
当然可以,只需要将其包裹在 ScrollView 中即可。 - Dheeraj Vepakomma
在调用“createCard”之前,您是否从该viewgroup中“removeAllViews”了? - Guian
4个回答

3

事实证明,当使用LayoutInflater替换ViewGroup的内容时,WebView不会被清除。其他控件似乎都被删除了(或者至少findViewWithTag()对于其他每个控件都返回正确的引用)。我在LayoutInflater执行操作之前立即添加了cvFrame.removeAllViews()这一行,问题得到了解决。 如果有人能够提供更好的解释,我将把积分给他们,否则它们将进入虚空......


1
我曾遇到过类似的问题,加载多个WebView内容时出现了问题。原因是错误使用了pauseTimers函数。
情况是这样的:第一个WebView不再需要,所以我想在释放它之前暂停它。调用了onPause()和pauseTimers()。 pauseTimers是所有Web视图共同具有的功能,这破坏了之后发生的所有Web视图的使用,它们只显示白色矩形。
也许这不是你遇到的问题,但值得检查一下你是否在某处调用了WebView.pauseTimers()

1

嗯,情况似乎并非如此,因为您的inflate调用应该在您的'cvFrame' viewGroup中创建新视图。在调用'createCard'之前,您是否从此viewgroup中'removeAllsViews'了? - Guian

1

为确认您的答案,LayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)的源代码实际上内部调用了root.addView(),将新填充的视图附加在根视图的子元素末尾而不是替换它们。

所以现在的谜团是,为什么您对findViewWithTag()的调用对于其他小部件(这将是最近创建的顶部实例)返回预期的对象,但对于WebView返回其他内容。

您的布局XML中是否有另一个对象共享相同的"card_back_title"标签?

我还想知道为什么您没有使用更常见的findViewById(),但我不确定是否会有任何区别。


我有多个相同视图的实例。我不确定如果多个子视图可以共享相同的ID,如果它们有不同的父视图?所以我选择了标签(我想我是把标签看作HTML中的类,而将ID看作ID,不确定是否有效)。 - Matt Fellows

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接