关于这个话题的无数问题后,我还没有完全解决问题。 最后,第一个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());
}
}
答案 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);
}
}