3

编辑:tl;博士: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);

    } 
}

当动画发生并且我替换卡片的内容时,TextViewsuit被替换得很好,代码肯定会通过代码来替换 WebView 内容,但由于某种原因,我最终得到了一个白色矩形,其大小和形状与WebView,没有内容,没有透明度。

如果我将 WebView 更改为 TextView,它的内容会被很好地替换,所以这是一个仅在 WebView 控件中出现的问题:S

谁能告诉我为什么/建议修复?

4

4 回答 4

3

事实证明,当使用 LayoutInflater 替换 ViewGroup 的内容时,WebView 不会被清除。其他控件似乎都被删除了(或者至少findViewWithTag()为每个其他控件返回了正确的引用)。我刚刚在cvFrame.removeAllViews()LayoutInflater 执行此操作之前添加了该行并解决了该问题。如果有人对此有任何更好的解释,我会按照他们的方式提出观点,否则他们只会进入以太......

于 2013-02-25T09:14:10.537 回答
1

我在加载几个 WebViews 内容时遇到了类似的问题。这是因为误用了pauseTimers函数

情况是:第一个 webView 不再需要了,我很认真地想在释放它之前暂停它。调用 onPause() 和 pauseTimers()

pauseTimers 对任何 web 视图都是通用的,它破坏了之后发生的每一次 webview 的使用,只显示白色矩形。

也许这不是你的问题,但值得检查你没有在WebView.pauseTimers()某个地方打电话。

于 2013-02-28T12:05:45.707 回答
1

通过调用 findViewById,您会获得对先前加载的 webview 的引用,对吗?

所以失败的 loadData 调用是您在单个 webview 实例上进行的第二个调用。

您可能想检查一下: Android WebView - 1st LoadData() 工作正常,后续调用不更新显示

看来 loadData() 不会加载数据两次...您可能想尝试WebView.loadDataWithBaseUri()

希望有帮助。

于 2013-02-28T12:13:57.920 回答
1

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

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

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

我也想知道为什么你不使用更常见的findViewById(),但我不确定它是否会有所作为。

于 2013-03-04T08:06:56.440 回答