我在我的应用中的两个位置使用自定义视图ColorStrip
:ListView
个项目和单独的FragmentActivity
。 ListView项目正确显示我的视图,但由于某些奇怪的原因,当为ColorStrip
创建FragmentActivity
时,hPx
和wPx
变量设置为所有数字分别为102和8。如果我在为ListView项创建它们时检查这些变量的值(在执行onCreate()
期间),它们都显示为零。但是当它为FragmentActivity创建ColorStrip时,它们被分配那些奇怪的价值观。
我不明白为什么变量在为FragmentActivity创建时会获得0以外的赋值。
以下是我的View
子类的所有代码:
public class ColorStrip extends View {
public ShapeDrawable mDrawable;
private static int hPx = 0;
private static int wPx = 0;
public ColorStrip(Context context, AttributeSet attrs) {
super(context, attrs);
mDrawable = new ShapeDrawable(new RectShape());
TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
R.styleable.ColorStrip, 0, 0);
try {
int color = a.getInt(R.styleable.ColorStrip_color, 0);
if (color != 0)
setColor(color);
} finally {
a.recycle();
}
}
protected void onDraw(Canvas canvas) {
if (wPx == 0)
wPx = getWidth();
if (hPx == 0)
hPx = getHeight();
mDrawable.setBounds(0, 0, wPx, hPx);
mDrawable.draw(canvas);
}
public void setColor(int color) {
mDrawable.getPaint().setColor(color);
}
}
这是ListView的XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal">
<com.acedit.assignamo.ui.ColorStrip
android:id="@+id/assignment_list_color_strip"
android:layout_width="@dimen/color_strip_width"
android:layout_height="match_parent" />
和FragmentActivity的XML:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ColorStrip="http://schemas.android.com/apk/res/com.acedit.assignamo"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<com.acedit.assignamo.ui.ColorStrip
android:id="@+id/assignment_view_color_strip"
android:layout_width="match_parent"
android:layout_height="@dimen/assignment_view_color_strip_height" />
为什么变量被赋予这些奇怪的值?
答案 0 :(得分:1)
不要将hPx和wPx声明为静态。另外,缓存它们并且只需在第一次调用onDraw时设置它就不是一个好主意。根据{{3}}上的View.onSizeChanged()文档,Custom Drawing是一个更好的地方。