Две вещи
1) Действие по умолчанию для представления - заполнить его родительский элемент, поэтому, применяя (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT) в качестве LayoutParams, вы создаете четыре вида с высотой и шириной размера родительского макета ( предположительно экран), поэтому вы увидите только один, так как остальные будут расположены за кадром.
Чтобы это исправить, либо установите желаемый размер кружков в качестве LayoutParms,
float dpi = getResources().getDisplayMetrics().density;
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams((int)(50.0f * dpi), (int)(50.0f * dpi));
или вы можете переопределить метод onMeasure (int x, int y) в круговом представлении следующим образом:
@Override
public void onMeasure(int x, int y) {
float dpi = getResources().getDisplayMetrics().density;
setMeasuredDimension((int)(50.0f * dpi), (int)(50.0f * dpi));
}
2) Не устанавливайте для своего идентификатора просмотра значение 0 ... Я не могу вспомнить, зарезервировано ли оно системой или чем-то, но это не очень хорошо играет.
Кроме того, если вы хотите, чтобы все круги центрировались в ваших кругах, вам нужно будет установить их гравитацию в центр следующим образом.
public class Circles extends RelativeLayout {
public Circles (Context ctx) {
super(ctx);
this.setGravity(Gravity.CENTER);
addViewChildren();
}
Это отцентрирует всех детей кругов, давая вам желаемый результат.