Пользовательский метод 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() останова, но точка останова никогда не попадает внутрь onDraw() , что не так?

Добавьте setWillNotDraw(false) в конструктор MyDrawableView. Оригинальный ответ здесь .

Ваш вид имеет высоту 0. Вы установили, что у вашего представления есть height=wrap_content , но вы не переопределяете onMeasure() чтобы сообщить инструментарию пользовательского интерфейса, насколько велика ваша View.

Вам нужно @Override метод OnMeasure(int, int) чтобы указать размер вашего представления, вызвав setMeasuredDimension(int,int) .

Если вы этого не сделаете, метод по умолчанию установит, что ваш вид имеет размер width=0 height=0 . И поэтому даже не пытайтесь вызвать onDraw вообще.

Метод OnMeasure вызывает setMeasuredDimension(int,int) который указывает, насколько велика ваша точка зрения.

(Так что вам нужно получить размер экрана андроида по методу OnMeasure и вызвать setMeasuredDimension соответственно).

Просто сделайте layout_width и layout_height пользовательского представления некоторое исправление в начальное время, а не wrap_content или fill_parent . Это сработало для меня.

Хотя я новичок в андроиде, все же я считаю, что проблема связана с тем, что

 setContentView(R.layout.xmllayout); 

Вместо "R.layout.xmllayout" , MyDrawableView объект MyDrawableView (используя findViewById ) и проверьте. Я не пробовал, но надеюсь, что это сработает.

Вы должны использовать invalidate () в методе конструктора, чтобы получить onDraw Called.

После установки пользовательской ширины просмотра вы должны установить ширину прокрутки.

 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();