это мой первый вопрос.
Я создал пользовательский компонент: RelativeLayout
с TextView
внизу и двумя ImageView
над ним, действуя как кликабельный элемент гистограммы с двумя столбцами. Чтобы установить высоту бара, я получаю «доступную высоту» в onLayout()
, как высоту контейнера минус единица метки:
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
mAvailHeight = getHeight()-findViewById(R.id.label).getHeight(); // it works
, а затем назначьте его (умноженное на значение 0-1.) В качестве параметра макета для ImageView:
View bar = findViewById(R.id.bigBar);
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) bar.getLayoutParams();
rlp.height = Math.round((float)mAvailHeight * mBigBarHeight);
}
Переменная mBigBarHeight
(0.-1.) Может быть установлена с помощью этой функции:
public void setBigBarHeight(float value, float max) {
mBigBarHeight = value / max;
requestLayout(); //
invalidate(); // do these help? i find no difference
}
Теперь. Когда я добавляю один из этих «HistogramBar» в onCreate()
и устанавливаю высоты и маркирую, все работает, как я ожидаю. Если я попытаюсь изменить их позже, скажем onClickSomething:
bar.setBigBarHeight(25, 100);
bar.setSmallBarHeight(50, 100);
bar.setLabel("jjk");
меняется только метка. Я проверил с помощью Hierarchy Viewer, и фактически LayoutParams изменился. Если я нажму еще раз, появятся изменения.
Самое смешное, что , даже если я выполняю «Load View Hierarchy» из инструмента , изменения отображаются (на эмуляторе) !! Что просходит? Это странно? Я хочу сделать это в своем коде, чтобы он работал!
Я не смог найти ни одного подобного вопроса. Спасибо.