3

編集:tl; dr:WebViewは正しく設定されているように見えますが、白いボックスとして表示されます。実際、最初の2回は機能しますが、その後は失敗します)

編集:実際の問題を示すビデオ...

ビューを定義する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);
    }
}

このメソッドがアクティビティのonCreateメソッドの一部として呼び出されると、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);

    } 
}

アニメーションが発生し、カードの内容を置き換えると、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

あなたの答えを確認するために、ソースコードLayoutInflater.inflate(int resource, ViewGroup root, boolean attachToRoot)は実際には、ルートの子を置き換えるのではなく、新しく膨張したビューをルートの子の最後にアタッチする内部呼び出しを行います。root.addView()

したがって、ミステリーはfindViewWithTag()、他のウィジェット (最近作成されたトップのインスタンス) の期待されるオブジェクトを への呼び出しが返す理由ですが、WebView の場合は別のものを返していたのです。

同じ「card_back_title」タグを共有するレイアウト XML に別のオブジェクトがある可能性はありますか?

また、なぜより一般的なものfindViewById()を代わりに使用しなかったのか疑問に思っていましたが、それが違いを生むかどうかはわかりません.

于 2013-03-04T08:06:56.440 に答える
1

I had a similar problem loading several WebViews content. It was because of a misusing of the pauseTimers function

The situation was : the first webView weren't needed anymore, conscientiously I wanted to pause it before to release it. Calling onPause() and pauseTimers()

pauseTimers being common to any web views, it broke every use of webviews occuring after that, there were displaying only white rectangles.

Maybe its not your problem here, but it's worth checking your not calling WebView.pauseTimers() somewhere.

于 2013-02-28T12:05:45.707 に答える
1

findViewById を呼び出すことで、以前に読み込まれた webview の参照を取得していますか?

したがって、失敗する loadData 呼び出しは、単一の webview インスタンスで行う 2 番目の呼び出しです。

これを確認することをお勧めします: Android WebView - 最初の LoadData() は正常に動作し、その後の呼び出しでは表示が更新されません

loadData() はデータを 2 回ロードしないようです... WebView.loadDataWithBaseUri()を試してみてください。

それが役立つことを願っています。

于 2013-02-28T12:13:57.920 に答える