web-dev-qa-db-ja.com

呼び出されないカスタム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()メソッド内でブレークポイントにヒットすることはありません。何が問題なのですか?

41
mynameisanthpny

MyDrawableViewコンストラクターにsetWillNotDraw(false)を追加します。元の答えは here です。

89

ビューの高さは0です。ビューに_height=wrap_content_を設定しますが、onMeasure()をオーバーライドせずに、UIツールキットにビューの大きさを伝えます。

36
Romain Guy

OnMeasure(int, int)を呼び出してビューのサイズを指定するには、_@Override_ setMeasuredDimension(int,int)メソッドを使用する必要があります。

そうしないと、デフォルトのメソッドはビューをサイズ_width=0 height=0_に設定します。そのため、onDrawを呼び出そうとしないでください。

OnMeasureメソッドは、ビューの大きさを伝えるsetMeasuredDimension(int,int)を呼び出します。

(したがって、OnMeasureメソッドでAndroid画面のサイズを取得し、それに応じてsetMeasuredDimensionを呼び出す必要があります)。

15
Gust Jc

layout_widthまたはlayout_heightの代わりに、カスタムビューのwrap_contentおよびfill_parentを初期時に修正するだけです。それは私のために働いた。

3
virajdasondi

カスタムビューの幅を設定したら、スクロール幅を設定する必要があります。

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(); 
0
John Great

多分

_setMinimumHeight(width);
setMinimumWidth(height);
_

コンストラクターで設定されていないか、onMeasure()がオーバーライドされていません。

0
CoolMind

ビューが表示されないもう1つの理由を次に示します。サブビューを使用してカスタムViewGroupを作成する場合は、ViewGroupにサブビューを追加することを忘れないでください。

ViewGroupコンストラクター呼び出しで

_addView(mySubView);
_

また、onLayout()でサブビューを測定およびレイアウトすることを忘れないでください

_@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
    mySubview.measure(...);
    mySubview.layout(...);
}
_
0
Suragch

私はAndroidの初心者ですが、それでも問題の原因は

setContentView(R.layout.xmllayout); 

の代わりに "R.layout.xmllayout"MyDrawableViewオブジェクト(findViewByIdを使用)を渡して確認します。試したことはありませんが、うまくいくことを願っています。

0
Biplab Kundu

OnDraw Calledを取得するには、コンストラクターメソッドでinvalidate()を使用する必要があります。

0