自定义的onDraw()方法不被调用

<LinearLayout android:id="@+id/svLL" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ScrollView android:id="@+id/sv" android:layout_width="wrap_content" android:layout_height="wrap_content" xmlns:android="http://schemas.android.com/apk/res/android"> <!-- <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/scrollbar_2_text" /> --> <com.mypackage.MyDrawableView android:layout_width="fill_parent" android:layout_height="wrap_content" /> </ScrollView> </LinearLayout> 

 public class MyDrawableView extends View { Context thisContext; public MyDrawableView(Context context, AttributeSet attr) { super(context); thisContext = context; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); final Paint paint = new Paint(); paint.setColor(Color.BLUE); paint.setTextSize(12); canvas.drawText("Blah blah", 0, 100, paint); } } 

 public class MyActivity extends Activity { // Your member variable declaration here // Called when the activity is first created. @Override public void onCreate(Bundle savedInstanceState) { // Your code here super.onCreate(savedInstanceState); setContentView(R.layout.xmllayout); LinearLayout svll = (LinearLayout) findViewById(R.id.svLL); svll.setLayoutParams(new LinearLayout.LayoutParams(300, 300)); } } 

我正在放置一个断点,但断点在onDraw()方法里面不会被打到,怎么了?

在MyDrawableView构造函数中添加setWillNotDraw(false) 。 原来的答案在这里 。

您的视图的高度为0.您将视图设置为height=wrap_content ,但是您不要覆盖onMeasure()来告诉UI工具箱View有多大。

您需要通过调用setMeasuredDimension(int,int) OnMeasure(int, int)方法来指定视图的大小。

如果你不这样做,默认的方法将设置你的视图的大小width=0 height=0 。 因此,甚至不要试图打电话给onDraw

OnMeasure方法调用setMeasuredDimension(int,int) ,它告诉您视图有多大。

(所以你需要在OnMeasure方法上获得android屏幕的大小,并相应地调用setMeasuredDimension )。

只需要使layout_widthlayout_height的自定义视图在初始阶段得到修复,而不是wrap_contentfill_parent 。 这对我有效。

虽然我是Android新手,但我相信问题是因为

 setContentView(R.layout.xmllayout); 

而不是"R.layout.xmllayout" ,传递MyDrawableView对象(使用findViewById )并检查。 我没有尝试,但希望,它会工作。

您需要在构造函数方法中使用invalidate()来获取调用的onDraw。

设置自定义视图宽度后,应设置滚动宽度。

 FMChart = (HKFMDrawChart)findViewById(R.id.fm_chart); FMChart.setWidth(xxxx); float scrollViewWidth = FMChart.getScrellViewWidth(); FMChart.setLayoutParams(new LinearLayout.LayoutParams( (int) (scrollViewWidth + HKApplication.getScreenWidth() / 2), LinearLayout.LayoutParams.WRAP_CONTENT)); FMChart.postInvalidate(); // onDraw(); 

大概

 setMinimumHeight(width); setMinimumWidth(height); 

在构造函数中未设置或onMeasure()未被覆盖。