24

を使用して、画像を含む HTML のブロックを TextView に読み込もうとしています

URLImageParser p = new URLImageParser(articleBody, this);
Spanned htmlSpan = Html.fromHtml(parsedString, p, null);

ちなみに、parsedString は HTML です。とにかく、それはロードされますが、画像にはそれらが収まるスペースが作成されていないため、その上のテキストに重なってしまいます. ここに私の URLImageParser ファイルがあります:

public class URLImageParser implements Html.ImageGetter {
Context c;
View container;

/***
 * Construct the URLImageParser which will execute AsyncTask and refresh the container
 * @param t
 * @param c
 */
public URLImageParser(View t, Context c) {
    this.c = c;
    this.container = t;
}

public Drawable getDrawable(String source) {
    URLDrawable urlDrawable = new URLDrawable();

    // get the actual source
    ImageGetterAsyncTask asyncTask = 
        new ImageGetterAsyncTask( urlDrawable);

    asyncTask.execute(source);

    // return reference to URLDrawable where I will change with actual image from
    // the src tag
    return urlDrawable;
}

public class ImageGetterAsyncTask extends AsyncTask<String, Void, Drawable>  {
    URLDrawable urlDrawable;

    public ImageGetterAsyncTask(URLDrawable d) {
        this.urlDrawable = d;
    }

    @Override
    protected Drawable doInBackground(String... params) {
        String source = params[0];
        return fetchDrawable(source);
    }

    @Override
    protected void onPostExecute(Drawable result) {
        // set the correct bound according to the result from HTTP call
        Log.d("height",""+result.getIntrinsicHeight());
        Log.d("width",""+result.getIntrinsicWidth());
        urlDrawable.setBounds(0, 0, 0+result.getIntrinsicWidth(), 0+result.getIntrinsicHeight()); 

        // change the reference of the current drawable to the result
        // from the HTTP call
        urlDrawable.drawable = result;

        // redraw the image by invalidating the container
        URLImageParser.this.container.invalidate();
    }

    /***
     * Get the Drawable from URL
     * @param urlString
     * @return
     */
    public Drawable fetchDrawable(String urlString) {
        try {
            URL aURL = new URL(urlString);
            final URLConnection conn = aURL.openConnection(); 
            conn.connect(); 
            final BufferedInputStream bis = new BufferedInputStream(conn.getInputStream()); 
            final Bitmap bm = BitmapFactory.decodeStream(bis);
            Drawable drawable = new BitmapDrawable(bm);
            drawable.setBounds(0,0,bm.getWidth(),bm.getHeight());
            return drawable;
        } catch (Exception e) {
            return null;
        } 
    }
}

}

何か案は?ありがとうございます。

4

5 に答える 5

55

コインテイナー c (ビュー) を textView に変更してから、onPostExecute を次のようにすることができます。

@Override 
protected void onPostExecute(Drawable result) { 
    // set the correct bound according to the result from HTTP call 
    Log.d("height",""+result.getIntrinsicHeight()); 
    Log.d("width",""+result.getIntrinsicWidth()); 
    urlDrawable.setBounds(0, 0, 0+result.getIntrinsicWidth(), 0+result.getIntrinsicHeight());  

    // change the reference of the current drawable to the result 
    // from the HTTP call 
    urlDrawable.drawable = result; 

    // redraw the image by invalidating the container 
    URLImageParser.this.container.invalidate();

    // For ICS
    URLImageParser.this.container.setHeight((URLImageParser.this.container.getHeight() 
    + result.getIntrinsicHeight()));

    // Pre ICS
    URLImageParser.this.textView.setEllipsize(null);
} 

これは最初に画像を描画し、すぐに TextView の高さをドローアブルの高さ + TextViews の高さに設定します。

于 2012-04-18T11:35:36.287 に答える
2

Martin S に投票するほどの評判はありませんが、彼の回答は本当に役に立ちます。また、ロード前に TextView がデフォルトの画像を表示している場合は、setHeight() メソッドを次のように変更できます。

    URLImageParser.this.container.setHeight((URLImageParser.this.container.getHeight() 
+ result.getIntrinsicHeight()-mDefaultDrawable.getInstrinsicHeight()));
于 2014-05-06T04:42:17.000 に答える
0

コンテナを View から TextView に変更する必要はないかもしれません。

   @Override
    protected void onPostExecute(Drawable result) {
        // set the correct bound according to the result from HTTP call
        urlDrawable.setBounds(0, 0, 0 + result.getIntrinsicWidth(), 0
                + result.getIntrinsicHeight());

        // change the reference of the current drawable to the result
        // from the HTTP call
        urlDrawable.drawable = result;

        // redraw the image by invalidating the container
        URLImageParser.this.container.setMinimumHeight((URLImageParser.this.container.getHeight()+ result.getIntrinsicHeight()));
        URLImageParser.this.container.requestLayout();
        URLImageParser.this.container.invalidate();
    }
于 2013-03-22T03:03:58.417 に答える
-2

テキストビューにロードする必要がある特別な理由はありますか?代わりにWebViewを使用できますか?

Webビューを使用できない場合、最善の解決策は、画像をテキストビューに配置しないことです。画像をImageViewに配置します。TextViewsには、画像とテキストを相互に関連させて配置する場所を特定するために必要なレイアウトエンジン機能がありません。これらはViewGroups(LinearLayoutやRelativeLayoutなど)ではないため、内部レイアウト指定機能はありません。Webビュー(およびWebビューにあるすべての優れたレイアウトエンジン)を本当に使用したくない場合は、個々のTextViewとImageViewを自分で配置する方法を理解する必要があります。

于 2011-10-24T01:04:28.773 に答える