2011-02-15 98 views
0

经过关于这个话题的许多问题,我仍然没有完全解决这个问题。 最后,第一个图像视图总是被“覆盖”,或者说更好地被另一个视图重叠,该视图应该放在该视图的右侧。Android动态RelativeLayout和子视图创建

在扩展RelativeLayout之后,是否只需要覆盖子视图布局的onLayout()方法就足够了? onLayout方法是将所有的孩子放在一个通行证中,还是每个特定的孩子都需要?如果我想使用RelativeLayouts特定的placemnts(RIGHT_OF,BELOW等...),那么onLayout方法应该如何实现子部署?

在创建视图时,如何创建一个没有layoutparams的视图,甚至有可能吗?

编辑:好的,我避免使用任何形式的getWidth,仍然得到不好的布局。图标第一行混合但满(5个图标),下一行只有1个图标,2个丢失。在这一点上,我非常沮丧,因为这是一个愚蠢的问题,我似乎无法找到问题所在,为什么官方开发者教程对动态布局和视图有更多帮助?

从向下Log.e说: 2:RIGHT 1 3:RIGHT 2 4:3 5 RIGHT:RIGHT OF 4 6:低于1 7:RIGHT OF 6 8:RIGHT OF 7 9:正确的8

这就是它应该是这样但它不起作用的方式,我不能设置相对位置布局应该已经布局?

private void loadResources() { 

cursor = managedQuery(Browser.BOOKMARKS_URI, projection, selection, 
null, SORT_BY_COLUMN + " " + SORT_ORDER); 
this.startManagingCursor(cursor); 

ImageView previousBookmark; 

int idOfViewToTheLeft = 1; 

if(cursor.moveToFirst()) { 
    bookmarkCounter = 1; 
    ByteArrayInputStream blobImage; 

    int size = (int) scale * FAVICON_SIZE; 
    int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); 
    int rowBookmarkCount = (int) (screenWidth/(size + scale*leftMargin)); 

    do{ 
     bookmark = new ImageView(this); 
     bookmark.setId(bookmarkCounter++); 
     bookmark.setBackgroundColor(Color.WHITE); 

     blobImage = new ByteArrayInputStream(
       cursor.getBlob(cursor.getColumnIndex(BookmarkColumns.FAVICON))); 

     bookmark.setImageDrawable(
       Drawable.createFromStream(blobImage, "" + bookmark.getId())); 

     urls.put(bookmark.getId(), 
       cursor.getString(
         cursor.getColumnIndex(BookmarkColumns.URL))); 

     bookmark.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent browserIntent = new Intent(
         Intent.ACTION_VIEW, Uri.parse(urls.get(v.getId()))); 
       startActivity(browserIntent); 
      } 
     }); 

     lp = new RelativeLayout.LayoutParams(size, size); 

     lp.topMargin = (int) (scale * topMargin); 
     lp.leftMargin = (int) (scale * leftMargin); 
     if(bookmark.getId() > 1) { 
      previousBookmark = (ImageView) findViewById(bookmark.getId() - 1); 

      if((bookmark.getId() % (rowBookmarkCount + 1)) != 0) 
      { 
       Log.e("" + bookmark.getId(), "RIGHT OF " + previousBookmark.getId()); 
       lp.addRule(RelativeLayout.RIGHT_OF, previousBookmark.getId()); 
      } else { 
       Log.e("" + bookmark.getId(), "BELOW " + idOfViewToTheLeft); 
       lp.addRule(RelativeLayout.BELOW, idOfViewToTheLeft); 
       idOfViewToTheLeft = bookmark.getId(); 
      } 
     } 

     bookmarkLayout.addView(bookmark, lp); 
    } while (cursor.moveToNext()); 
} 
} 

回答

0

我在最后做了什么,是退出使用相对参数来描述视图相对于其他视图的位置。相反,我自己完成了所有的数学计算,并将所有内容都放入了setMargins中,希望这同样能够比使用Relativelayouts方法更快地算出它。

private void loadResources() { 

cursor = managedQuery(Browser.BOOKMARKS_URI, projection, selection, 
null, SORT_BY_COLUMN + " " + SORT_ORDER); 
this.startManagingCursor(cursor); 

if(cursor.moveToFirst()) { 
    bookmarkCounter = 0; 
    ByteArrayInputStream blobImage; 

    int leftMargin = (int) (scale * this.leftMargin); 
    int topMargin = (int) (scale * this.topMargin); 
    int size = (int) scale * FAVICON_SIZE; 
    int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); 
    int rowBookmarkCount = (int) (screenWidth/(size + leftMargin)); 

    do{ 
     bookmark = new ImageView(this); 
     bookmark.setId(bookmarkCounter++); 
     bookmark.setBackgroundColor(Color.WHITE); 

     blobImage = new ByteArrayInputStream(
       cursor.getBlob(cursor.getColumnIndex(BookmarkColumns.FAVICON))); 

     bookmark.setImageDrawable(
       Drawable.createFromStream(blobImage, "" + bookmark.getId())); 

     urls.put(bookmark.getId(), 
       cursor.getString(
         cursor.getColumnIndex(BookmarkColumns.URL))); 

     bookmark.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent browserIntent = new Intent(
         Intent.ACTION_VIEW, Uri.parse(urls.get(v.getId()))); 
       startActivity(browserIntent); 
      } 
     }); 

     lp = new RelativeLayout.LayoutParams(size, size); 
     lp.setMargins(
       (int) (leftMargin + (bookmark.getId() % rowBookmarkCount) * (size + leftMargin)), 
       (int) (topMargin + (bookmark.getId()/rowBookmarkCount) * (size + topMargin)), 
       0, 0); 
     bookmarkLayout.addView(bookmark, lp); 
    } while (cursor.moveToNext()); 
    setContentView(scrollView); 
} 
} 
0

对于标准组件,您并不需要重写onLayout,如果您希望它们像往常一样布局组件。如果你重写onLayout并且不要调用super.onLayout,那么你必须手动定位所有的孩子。

否则,只要使用与RelativeLayout.LayoutParams添加规则(下面,在上面,等等。),并将其设置添加视图addView(youView,yourLayoutParamsInstance)

+0

见这就是问题所在,他们告诉我,我不能在创建更改视图位置,因为我需要它不能在该阶段中使用的getWidth方法。 @AlexOrlov – lpandzic 2011-02-15 15:40:53

+0

如果我记得正确的话,onMeasure会在onLayout之前调用,这就是您可以通过父级强制获取布局的尺寸。 在我的练习中,通过getWidth获取维度对于这样的任务是毫无意义和错误的。 – 2011-02-15 15:51:58

0

RelativeLayout大多数逻辑的过程中实际发生时测量阶段,所以不,只是覆盖onLayout是最不可能的。

如果你想扩展RelativeLayout,恐怕你得习惯了它的源代码,否则这将是十分困难的理解如何影响它的行为。你应该真的考虑找到另一个解决方案,因为你真的用RelativeLayout选择了一个更复杂的类。