Android ImageGetter images overlapping text

后端 未结 5 1372
一个人的身影
一个人的身影 2020-12-01 04:14

I\'m trying to load a block of HTML into a TextView, including images, using

URLImageParser p = new URLImageParser(articleBody, this);
Spanned htmlSpan = Ht         


        
相关标签:
5条回答
  • 2020-12-01 04:24

    may be we need not change container from View to 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();
        }
    
    0 讨论(0)
  • 2020-12-01 04:34

    Is there a particular reason you need to load it into a text view? Could you just use a WebView instead?

    If you can't use Webviews, then the best solution is to not put the images in your text view. Put the images in an ImageView. TextViews don't have any of the layout engine capabilities you need to figure out where to put images and texts in relation to each other. They're not ViewGroups (like LinearLayout or RelativeLayout) and thus have no internal layout specifying capabilities. If you really don't want to use a webview (and all the nice layout engine stuff it has), you're going to have to figure out how to arrange individual TextViews and ImageViews yourself.

    0 讨论(0)
  • 2020-12-01 04:34

    You could change your cointainer c (view) to a textView and then make your onPostExecute look like this:

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

    This will first draw the image and then immediately set the height of the TextView to the drawable's height + the TextViews height

    0 讨论(0)
  • 2020-12-01 04:34

    I don't have enough reputation to vote up for Martin S,but his answer is really helpful。And if TextView has displayed a default image before loading,we can change the setHeight() method like this:

        URLImageParser.this.container.setHeight((URLImageParser.this.container.getHeight() 
    + result.getIntrinsicHeight()-mDefaultDrawable.getInstrinsicHeight()));
    
    0 讨论(0)
  • 2020-12-01 04:39

    I found a interesting behavior with those solutions: if the loading of an image is to fast and the textview has not been rendered yet (e.g. I use Okhttp with caching, so the second call is quite fast), the textview size is 0.

    To resolve this issue, I had converted the ImageGetter back from the AsyncTask and instead start a AsyncTask which creates the Spanned for my TextView and sets the text afterwards.

    With this solution it's not required to resize the TextView each time an Image is loaded.

    new AsyncTask<TextView, Void, Spanned>() {
          TextView tv;
          @Override
          protected Spanned doInBackground(TextView... params) {
            tv = params[0];
            return Html.fromHtml(feedEntry.getContent(),
                    new HttpImageGetter(getActivity(), HttpLoaderImpl.getInstance(getActivity())),
                    new Html.TagHandler() {
    
                      @Override
                      public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {
                        //do nothing...
                      }
                    });
          }
    
          @Override
          protected void onPostExecute(final Spanned result) {
            new Handler(Looper.getMainLooper()).post(new Runnable() {
    
              @Override
              public void run() {
                tv.setText(result);
              }
            });
          }
        }.execute(textView);
    
    0 讨论(0)
提交回复
热议问题