我做了一個「GraphBar」自定義視圖,該視圖的底部爲TextView
,而ImageView
爲高度不等,高度爲的RelativeLayout
。下面是代碼:我的自定義視圖只在添加到onCreate時繪製
public class GraphBar extends RelativeLayout {
private int mAvailHeight; // space for the bar (component minus label)
private float mBarHeight; // 0.0-1.0 value
public GraphBar(Context context) {
this(context, null);
}
public GraphBar(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public GraphBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
LayoutInflater.from(context).inflate(R.layout.graphbar, this, true);
setId(R.id.graphBar); // defined in <merge> but not assigned (?)
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mAvailHeight = getHeight()-findViewById(R.id.label).getHeight();
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
View bar2 = findViewById(R.id.smallBar);
RelativeLayout.LayoutParams llp2 = (RelativeLayout.LayoutParams) bar2.getLayoutParams();
llp2.height = Math.round((float)mAvailHeight * mBarHeight);
}
public void setBarHeight(float value, float max) {
mBarHeight = value/max;
findViewById(R.id.smallBar).requestLayout();
}
public void setLabel(CharSequence c) {
((TextView) findViewById(R.id.label)).setText(c);
}
}
雖然加入這些GraphBars並設置其onCreate()
作品高度的優勢,如果我創建它們onClickSomething或再次呼籲創建條setBarHeight()
,看到變化的唯一途徑是加載視圖層次。我被告知here這意味着我需要致電requestLayout()
。在修改mBarHeight
後還有什麼地方?任何幫助?我到處嘗試,也有invalidate()
。
謝謝 安德烈
(如果你需要我可以張貼與我做我的測試活動和graphbar.xml)
我發現它可能a bug。解決方法應該是,再次呼叫requestLayout()
。我仍然不明白我可以打電話的地方。