我在运行时向View
添加了RelativeLayout
,这工作正常,但现在我想在此TextView
左侧显示View
但是我无法检索此View
的顶部或左侧以计算TextView
的位置。
我的代码是
private void displayGuitar() {
for (GuitarString guitarString: guitar.getGuitarStrings()) {
GuitarStringView guitarStringView = new GuitarStringView(context, attributeSet, guitarString);
this.addView(guitarStringView);
// Add Note name
TextView noteNameView = new TextView(context);
RelativeLayout.LayoutParams noteParams =
new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
noteParams.addRule(LEFT_OF, guitarStringView.getId());
Log.w("string top", String.valueOf(guitarStringView.getTop()));
Log.w("string left", String.valueOf(guitarStringView.getLeft()));
noteParams.setMargins(0, 0, 2, 0);
noteNameView.setLayoutParams(noteParams);
noteNameView.setText(guitarString.getTunedNote().getNoteName(0));
this.addView(noteNameView);
}
}
这导致TextViews全部出现在彼此的顶部(在正确的X位置)但是我无法设置上边距,因为两个Log语句都返回0.我如何确定哪个顶部位置GuitarStringView
是?
修改
根据laalto的建议,我现在为guitarStringView
生成了ID,并确认它已被分配。但是,如果我使用LEFT_OF
,RIGHT_OF
等,则不会显示TextView
,但如果我使用ALIGN_PARENT_RIGHT
,它们会显示正常吗?代码现在如下
private void displayGuitar() {
for (GuitarString guitarString: guitar.getGuitarStrings()) {
GuitarStringView guitarStringView = new GuitarStringView(context, attributeSet, guitarString);
int viewId = guitarStringView.generateViewId();
guitarStringView.setId(viewId);
this.addView(guitarStringView);
// Add Note name
TextView noteNameView = new TextView(context);
RelativeLayout.LayoutParams noteParams =
new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
noteParams.addRule(RelativeLayout.LEFT_OF, viewId);
noteNameView.setLayoutParams(noteParams);
noteNameView.setText(guitarString.getTunedNote().getNoteName(0));
this.addView(noteNameView);
}
}
编辑2 由于我未根据文档defaults to 100x100.
覆盖我onMeasure()
的{{1}},因此首先接受的修复无效
答案 0 :(得分:1)
首先,您的guitarStringView
没有ID,getId()
将返回-1
,即NO_ID
。因此LEFT_OF
规则不起作用,因为它没有引用任何实际的id。要解决这个问题,只需在视图中设置一些ID即可。
其次,这个观点还没有被测量过,所以这就是为什么尺寸和位置都是零。
使用任意LEFT_OF,RIGHT_OF或BELOW的addRule,TextView不再显示
字符串视图可能占用了所有水平空间。添加另一个约束,例如ALIGN_PARENT_LEFT
,使文本视图左边缘与父相对布局的左边缘对齐。
答案 1 :(得分:0)
你说“在运行时”,这意味着你可能在onCreate或onResume中调用此方法。这些方法应该在onWindowFocusChanged(boolean)中按预期运行。