Android动态RelativeLayout和子视图创建

时间:2011-02-15 14:14:02

标签: android dynamic relativelayout

关于这个话题的无数问题后,我还没有完全解决问题。 最后,第一个imageview总是被“覆盖”或者更好地表示与另一个应该在该视图右侧的视图重叠。

扩展RelativeLayout之后是否只能覆盖onLayout()方法以进行子视图放置? onLayout方法是将所有孩子放在一个通道中还是为每个特定孩子调用?如果我想使用RelativeLayouts特定的placemnts(RIGHT_OF,BELOW等等),onLayout方法应该如何实现子位置

在视图创建中,如何创建没有layoutparams的视图,是否可能?

编辑:好的,我避免以任何形式使用getWidth,但仍然得到错误的布局。图标获得第一行混合但已满(5个图标),下一行仅有1个图标,缺少2个。在这一点上,我很沮丧,因为这是一个愚蠢的问题,我似乎无法找到什么是错的,为什么官方开发人员教程没有更多关于动态布局和视图的帮助?

log.e from down说: 2:权利1 3:权利2 4:权利3 5:权利4 6:低于1 7:权利6 8:权利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());
 }
}

3 个答案:

答案 0 :(得分:0)

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

否则,只需使用RelativeLayout.LayoutParams添加规则(BELOW,ABOVE等)并在添加视图时设置它addView(youView,yourLayoutParamsInstance)

答案 1 :(得分:0)

RelativeLayout中的大多数逻辑实际上都发生在测量阶段,所以不,只是覆盖onLayout很可能是不够的。

如果你想扩展RelativeLayout,我担心你必须习惯它的源代码,否则很难理解如何影响它的行为。你应该考虑找到另一个解决方案,因为你真的选择了一个更复杂的类RelativeLayout

答案 2 :(得分: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);
 }
}