Android не может добавлять дочерние элементы в пользовательский макет (наследуется от ViewGroup)

привет, я новичок в разработке Android, и я пытаюсь создать свой собственный макет:

public class EqLayout extends ViewGroup {

public EqLayout(Context context){
    super(context);
}

public EqLayout(Context context, AttributeSet attrs){
    super(context, attrs);
}

public EqLayout(Context context, AttributeSet attrs, int defstyle){
    super(context, attrs, defstyle);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int lato = getLato();
    int w = getMeasuredWidth()/lato;
    int h = getMeasuredHeight()/lato;
    int ws = MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY);
    int hs = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);

    for(int i = 0; i < getChildCount(); i++){
        View v = getChildAt(i);
        v.measure(ws, hs);
    }
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    int lato = getLato();
    int w = (r - l)/lato;
    int h = (t - b)/lato;

    for(int i = 0; i < getChildCount(); i++){
        View v = getChildAt(i);
        int x = i%lato, y = i/lato;
        v.layout(x*w, y*h, (x+1)*w, (y+1)*h);
    }

}

private int getLato(){
    int r = (int) Math.ceil(Math.sqrt(getChildCount()));
    r = (r > 0) ? r : r+1;
    return r;
    }
  }

Основная деятельность:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    EqLayout eql = (EqLayout) findViewById(R.id.eqlviewlayout);
    for(int i = 0; i < 14; i++){
        Button b = new Button(this);
        b.setText("#"+i);
        eql.addView(b);
    }
    }
}

и это xml:

XML-файл

Кажется, все работает нормально, но я не могу добавить к нему ребенка. Я пробовал во время выполнения и из Android Studio, перетаскивая кнопку, но безуспешно.

Кто-нибудь знает, почему так происходит? Спасибо за ваше время, спросите, нужна ли вам дополнительная информация.


person Levenlol    schedule 11.06.2016    source источник
comment
каков результат adb shell dumpsys activity top?   -  person pskink    schedule 12.06.2016
comment
как мне получить эту информацию?   -  person Levenlol    schedule 12.06.2016
comment
выполнив команду adb shell dumpsys activity top в окне терминала   -  person pskink    schedule 12.06.2016
comment
pastebin.com/95avfSzH   -  person Levenlol    schedule 12.06.2016
comment
странно, вы запускали его во время работы вашего приложения?   -  person pskink    schedule 12.06.2016
comment
хорошо, неважно, попробуйте вместо этого запустить hierarchyviewer и посмотреть свой собственный ViewGroup и его дочерние элементы   -  person pskink    schedule 12.06.2016
comment
вот что я получаю: imgur.com/ff96htR   -  person Levenlol    schedule 12.06.2016
comment
его пусто: вообще нет дерева просмотра   -  person pskink    schedule 12.06.2016


Ответы (1)


У вас отрицательный рост для ваших детей.

Просто замените в своем onLayout эту строку:

int h = (t - b)/lato;

с участием

int h = (b - t)/lato;

и ты хорош!

Скриншот

person Enrichman    schedule 12.06.2016