2014-04-26 6 views
0

두 개의 가로 스크롤보기를 보여주는 활동을 빌드 중입니다. 상단에는 큰 이미지가 있고 하단에는 이미지의 축소판이 있습니다. 사용자가 썸네일을 클릭하면 상단 스크롤보기가 자동으로 썸네일에 해당하는 이미지로 스크롤됩니다. 내 문제는 레이아웃의 getWidth() 메서드는 항상 0을 반환한다는 것입니다. 런타임에 레이아웃을 만든 다음 getwidth() 메서드를 호출하여 올바른 값을 반환해야하지만 그렇지 않습니다.getWidth() 메서드는 0을 반환합니다.

public class ZoomActivity extends Activity { 
    private final String THUMBS="http://kurdshopping.net/thumbs/"; 
    private final String UPLOADS="http://kurdshopping.net/uploads/"; 
    private ImageView imageView; 
    private String path; 
    private String[] filenames; 
    private LinearLayout l1,l2; 
    private int[] widths=null; 
    private HorizontalScrollView hsv=null; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
     setContentView(R.layout.activity_zoom); 

     ActionBarUtils.setActionBar(this); 

     path = getIntent().getExtras().getString("path"); 
     filenames=getIntent().getExtras().getStringArray("images"); 
     widths=new int[filenames.length]; 
     l1=(LinearLayout) findViewById(R.id.LinearLayout1); 
     l2=(LinearLayout) findViewById(R.id.LinearLayout2); 
     hsv=(HorizontalScrollView) findViewById(R.id.horizontalScrollView1); 

     for(int i=0; i<filenames.length; i++){ 
      BitmapLoaderTask task = new BitmapLoaderTask(i); 
      task.execute(UPLOADS+filenames[i],"1"); 
     } 
     for(int i=0;i<filenames.length;i++){ 
      BitmapLoaderTask task = new BitmapLoaderTask(i); 
      task.execute(THUMBS+filenames[i],"2"); 
     } 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.zoom, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
     case android.R.id.home: 
      finish(); 
      break; 
//  case R.id.action_all: 
//   Intent allitemIntent = new Intent(MainActivity.this, 
//     AllItemsActivity.class); 
//   startActivity(allitemIntent); 
//   break; 
//  case R.id.action_search: 
//   Intent search = new Intent(this, SearchDialogActivity.class); 
//   startActivity(search); 
//   break; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    private void setImageBitmap(Bitmap bmp) { 
     imageView = new ScrollableImageView(this); 
     imageView.setLayoutParams(new LayoutParams(bmp.getWidth(), bmp 
       .getHeight())); 
     imageView.setImageBitmap(bmp); 
     ViewGroup root = (ViewGroup) findViewById(android.R.id.content); 
     root.addView(imageView); 
    } 

    private class BitmapLoaderTask extends AsyncTask<String, Void, Bitmap> { 
     private String layout; 
     private int index; 
     private int x_coords=0; 
     public BitmapLoaderTask(int index){ 
      super(); 
      this.index=index; 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      setProgressBarIndeterminateVisibility(true); 
     } 

     @Override 
     protected synchronized Bitmap doInBackground(String... params) { 
//   AssetManager assets = getAssets(); 
      Bitmap bmp = null; 
      layout=params[1]; 
      try { 
       URL url = new URL(params[0]); 
       bmp = BitmapFactory.decodeStream(url.openConnection() 
         .getInputStream()); 

      } catch (IOException e) { 
       Log.e("ZoomActivity", e.getMessage(), e); 
      } 
      return bmp; 
     } 

     @Override 
     protected void onPostExecute(Bitmap result) { 
      super.onPostExecute(result); 
      View view=null; 
      try { 
       view=ImageUtils.insertPhoto(ZoomActivity.this, result); 
      } catch (MalformedURLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      if(layout.equals("1")){ 
       l1.addView(view); 
       view.setTag(x_coords); 
       x_coords+=((LinearLayout)view).getMeasuredWidth();// this is always returning 0, view.getLayoutParams().width is also same. 
      }else{ 
       l2.addView(view); 
       ImageView img=(ImageView) ((LinearLayout)view).getChildAt(0); 
       img.setTag(index); 
       img.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View v) { 
         int index=(Integer) v.getTag(); 
         LinearLayout layout = (LinearLayout) l1.getChildAt(index); 
         int x=(Integer) layout.getTag(); 
         hsv.scrollTo(x, 0); 
        } 
       }); 
      } 
//   ImageView imageview=(ImageView) findViewById(R.id.imageView1); 
//   imageview.setImageBitmap(result); 
//   setImageBitmap(result); 
      setProgressBarIndeterminateVisibility(false); 
     } 
    } 
} 

내가 도움을 사전에 레이아웃 -

public static View insertPhoto(final Activity activity, Bitmap bm) throws MalformedURLException, IOException { 
     LinearLayout layout = new LinearLayout(activity.getApplicationContext()); 
     layout.setLayoutParams(new LayoutParams(bm.getWidth()+10, bm.getHeight()+10)); 
     layout.setGravity(Gravity.CENTER); 

     final ImageView imageView = new ImageView(
       activity.getApplicationContext()); 
     imageView.setLayoutParams(new LayoutParams(bm.getWidth(), bm.getHeight())); 
     imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); 
     imageView.setImageBitmap(bm); 
//  imageView.setTag(filename); 

     layout.addView(imageView); 
     return layout; 
    } 

감사를 만드는 오전 insertPhoto 기능.

편집 : 너비가 필요한 부분 만 게시하고 있습니다. 나는 viewtreeoserver 사용하도록 수정 있지만 여전히 작동하지 않습니다 - 폭 방법 -이 당신을 도와줍니다

yourlayout.requestLayout(); 

희망을 얻을 사용하기 전에

l1.addView(view); 
        view.setTag(x_coords); 
        view.requestLayout(); 
        ViewTreeObserver vto=view.getViewTreeObserver(); 
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

         @Override 
         public void onGlobalLayout() { 
          x_coords+=((LinearLayout)view).getMeasuredWidth(); 
         } 
        }); 
+1

http://stackoverflow.com/a/18272220 – Sree

+0

않았습니다 스리가 작동 준 대답? – AndyFaizan

+0

** [here] (http://stackoverflow.com/questions/3591784/android-get-width-returns-0) ** 답변도 참조하십시오. – AndyFaizan

답변

0

이 코드를 사용해보십시오!

작동하지 않는 경우 더 알려 드리겠습니다.

편집 대답

는이 코드 - 시도

l1.addView(view); 
        view.setTag(x_coords); 
        view.requestLayout(); 
        ViewTreeObserver vto=view.getViewTreeObserver(); 
        vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 

         @Override 
         public void onGlobalLayout() { 
              view.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
          x_coords+=((LinearLayout)view).getMeasuredWidth(); 
         } 
        }); 
+0

여전히 0을 반환하고 있습니다. – Pankaj

+0

너는 너비에 대해서만 코드 스 니펫을 게시 할 수 있습니까? 어디에서 폭을 얻고 싶습니까? –

+0

제 생각에는 선형 레이아웃 인 "l1"의 getwidth를 시도하십시오. –

관련 문제