Подтвердить что ты не робот

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

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

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

Ответ 4

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

Ответ 5

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

setContentView(R.layout.xmllayout); 

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

Возможно

setMinimumHeight(width);
setMinimumWidth(height);

в конструкторе не установлены или onMeasure() не переопределяется.