2015-01-26 4 views
2

많은 양의 작성된 콘텐츠를 Android 앱의 읽기 쉬운 페이지로 변환합니다. 이 콘텐츠는 주로 텍스트와 이미지로 구성되지만 표가 포함됩니다.이미지가로드 될 때 TableRow가 다른 TableRow를 겹치게합니다 - Android

콘텐츠가 html로 다운로드되므로 URLImageParser 클래스와 함께 Html.fromHtml() 메서드를 사용하여 콘텐츠를 표시합니다.

내 응용 프로그램에서 TableLayout을 사용하고 있습니다. 내 코드는 지금처럼 작동 : 콘텐츠에는 테이블이없는 경우

  • 는 한 행에 모두 넣고 TableLayout을이 행을 추가
  • 하나 개의 테이블이있는 경우, 이전에 모든 콘텐츠를 얻을 수 이 행을 넣고 행을 테이블 레이아웃에 추가하십시오. 이제 테이블의 각 행에 대해 내용을 가져 와서 이것을 테이블 레이아웃의 행으로 추가하십시오. 그런 다음 테이블 뒤의 모든 컨텐츠를 행에 추가하고 테이블 레이아웃에 추가하십시오.
  • (등등 여러 테이블)이 코드는 잘 작동했다

, 나는에 실행 한 문제는 테이블 전에 내용이 이미지가 포함 된 경우입니다. 이 경우, 최초의 컨텐츠는, 이미지의로드가 완료하기 전에, 행으로서 TableLayout에 배치됩니다. 이미지로드가 완료되면이 tablerow의 크기가 이미지를 포함하도록 조정됩니다. 그러나 테이블 레이아웃의 다음 행은 그에 따라 아래로 이동하지 않습니다. 이것은 아래의 행이 첫 번째 tablerow와 겹치는 것을 의미합니다.

위의 행이 크기를 변경하면 아래 행을 조정하는 것이 이상적입니다. 가능한가요? 나는 온라인으로 보려고 노력해 왔으며 비슷한 것을 찾을 수 없었다.

나는 다른 접근법을 시도 해왔다. 나는 URL이 페이지 레이아웃에 추가되기 전에 URLImageParser가 이미지 로딩을 완료했을 때이를 감지하고 싶었다. (이는 내가 페이지를 열 때 잠시 멈출 것임을 의미한다) 하지만 나는이 일을 할 수 없다. 어떤 이유로 든 내 URLImageParser AsyncTask의 onPostExecute() 메서드가 호출되지 않습니다.

위의 행이 크기를 변경하면 tablerows를 다시 조정할 수있는 방법을 아는 사람이 있습니까? 또는로드 완료를 감지하려는 시도가 잘못되어있는 곳을 볼 수 있습니까? 부울 플래그 finishedExecuting을 사용하고 있지만 true로 설정되지 않습니다. 아래에 수업을 포함 시켰습니다.

감사합니다. 답장을 보내 주시면 감사하겠습니다.

URLImageParser.java는

public class URLImageParser implements ImageGetter { 
Context c; 
TextView container; 
Activity a; 
int intrinsicHeight; 
int intrinsicWidth; 
boolean finishedExecuting; 

public URLImageParser(TextView t, Context c, Activity a) { 
    this.c = c; 
    this.container = t; 
    this.a = a; 
    intrinsicHeight =0; 
    intrinsicWidth = 0; 
    finishedExecuting = false; 
} 

public Drawable getDrawable(String source) { 
    System.out.println("getDrawable() was called"); 
    URLDrawable urlDrawable = new URLDrawable(); 

    ImageGetterAsyncTask asyncTask = 
     new ImageGetterAsyncTask(urlDrawable); 

    asyncTask.execute(source); 

    return urlDrawable; 
} 

public class ImageGetterAsyncTask extends AsyncTask<String, Void, Drawable> { 
    URLDrawable urlDrawable; 
    boolean usesImageNotFoundDrawable = false; 

    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) { 
     System.out.println("ENTERED ON POST EXECUTE"); 
     //check to see if an image was found (if not could 
     //be due to no internet) 
     if(result ==null){ 
      usesImageNotFoundDrawable = true; 
      //the drawable wasn't found so use the image not found 
      //png 
      Drawable imageNotFound = a.getResources().getDrawable(R.drawable.image_not_found); 
      result = imageNotFound; 
     } else { 
      usesImageNotFoundDrawable = false; 
     } 

     intrinsicHeight = result.getIntrinsicHeight(); 
     intrinsicWidth = result.getIntrinsicWidth(); 

     DisplayMetrics dm = new DisplayMetrics(); 
     ((WindowManager) c.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(dm); 
     int width = dm.widthPixels -50; 
     int height = width * intrinsicHeight/intrinsicWidth; 

     result.setBounds(0, 0, 0 + width, 0 
       + height); 

     urlDrawable.setBounds(0, 0, 0+width, 0+height); 

     urlDrawable.drawable = result; 

     URLImageParser.this.container.invalidate(); 


     if(usesImageNotFoundDrawable == true){ 
      URLImageParser.this.container.setHeight((URLImageParser.this.container.getHeight() 
        + height*4)); 
     } else { 
      URLImageParser.this.container.setHeight((URLImageParser.this.container.getHeight() 
        + height)); 
     } 

     // Pre ICS 
     URLImageParser.this.container.setEllipsize(null); 

     setFinishedExecuting(true); 

     System.out.println("END OF ON POST EXECUTE"); 

    } 

    public Drawable fetchDrawable(String urlString) { 
     try { 
      InputStream is = fetch(urlString); 
      Drawable drawable = Drawable.createFromStream(is, "src");    
      return drawable; 
     } catch (Exception e) { 
      return null; 
     } 
    } 

    private InputStream fetch(String urlString) throws MalformedURLException, IOException { 
     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpGet request = new HttpGet(urlString); 
     HttpResponse response = httpClient.execute(request); 
     return response.getEntity().getContent(); 
    } 
} 

public boolean getFinishedExecuting(){ 
    return finishedExecuting; 
} 

public void setFinishedExecuting(boolean bool){ 
    finishedExecuting = bool; 
} 

}

답변

1

지금을 나타냈다. TableRow에서는 문제가되지 않았습니다. URLImageParser 클래스에 문제가있었습니다.

나는
if(usesImageNotFoundDrawable == true){ 
        URLImageParser.this.container.setHeight((URLImageParser.this.container.getHeight() 
       + height*4)); 
    } else { 
     URLImageParser.this.container.setHeight((URLImageParser.this.container.getHeight() 
       + height)); 
    } 

을 제거하고

이제 높이가 이미지를 제대로 감지
container.setText(container.getText()); 

로 대체하고 모든 내용이 제대로 표시됩니다.