经过关于这个话题的许多问题,我仍然没有完全解决这个问题。 最后,第一个图像视图总是被“覆盖”,或者说更好地被另一个视图重叠,该视图应该放在该视图的右侧。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());
}
}
见这就是问题所在,他们告诉我,我不能在创建更改视图位置,因为我需要它不能在该阶段中使用的getWidth方法。 @AlexOrlov – lpandzic 2011-02-15 15:40:53
如果我记得正确的话,onMeasure会在onLayout之前调用,这就是您可以通过父级强制获取布局的尺寸。 在我的练习中,通过getWidth获取维度对于这样的任务是毫无意义和错误的。 – 2011-02-15 15:51:58