添加运行时View不知道它的位置

时间:2014-01-05 14:13:29

标签: java android

我在运行时向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_OFRIGHT_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}},因此首先接受的修复无效

2 个答案:

答案 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)中按预期运行。

见另一个问题: getRight, getLeft, getTop returning zero