_<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)
を追加します。元の答えは here です。
ビューの高さは0です。ビューに_height=wrap_content
_を設定しますが、onMeasure()
をオーバーライドせずに、UIツールキットにビューの大きさを伝えます。
OnMeasure(int, int)
を呼び出してビューのサイズを指定するには、_@Override
_ setMeasuredDimension(int,int)
メソッドを使用する必要があります。
そうしないと、デフォルトのメソッドはビューをサイズ_width=0 height=0
_に設定します。そのため、onDraw
を呼び出そうとしないでください。
OnMeasure
メソッドは、ビューの大きさを伝えるsetMeasuredDimension(int,int)
を呼び出します。
(したがって、OnMeasure
メソッドでAndroid画面のサイズを取得し、それに応じてsetMeasuredDimension
を呼び出す必要があります)。
layout_width
またはlayout_height
の代わりに、カスタムビューのwrap_content
およびfill_parent
を初期時に修正するだけです。それは私のために働いた。
カスタムビューの幅を設定したら、スクロール幅を設定する必要があります。
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()
がオーバーライドされていません。
ビューが表示されないもう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(...);
}
_
私はAndroidの初心者ですが、それでも問題の原因は
setContentView(R.layout.xmllayout);
の代わりに "R.layout.xmllayout"
、MyDrawableView
オブジェクト(findViewById
を使用)を渡して確認します。試したことはありませんが、うまくいくことを願っています。
OnDraw Calledを取得するには、コンストラクターメソッドでinvalidate()を使用する必要があります。