<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));
}
}
Ich setze einen Haltepunkt, aber der Haltepunkt wird in der onDraw()
-Methode niemals getroffen. Was ist los?
Fügen Sie setWillNotDraw(false)
im MyDrawableView-Konstruktor hinzu. Ursprüngliche Antwort ist hier .
Ihre Ansicht hat eine Höhe von 0. Sie haben Ihre Ansicht so festgelegt, dass sie height=wrap_content
hat. Sie überschreiben jedoch nicht onMeasure()
, um dem UI-Toolkit mitzuteilen, wie groß Ihre Ansicht ist.
Sie müssen @Override
die OnMeasure(int, int)
-Methode angeben, um die Größe Ihrer Ansicht anzugeben, indem Sie setMeasuredDimension(int,int)
aufrufen.
Wenn Sie dies nicht tun, wird die Ansicht mit der Standardmethode auf die Größe width=0 height=0
festgelegt. Versuchen Sie deshalb nicht einmal, onDraw
aufzurufen.
Die OnMeasure
-Methode ruft setMeasuredDimension(int,int)
auf, die angibt, wie groß Ihre Ansicht ist.
(Sie müssen also die Größe des Android-Bildschirms für die Methode OnMeasure
ermitteln und entsprechend setMeasuredDimension
aufrufen).
Nehmen Sie einfach layout_width
und layout_height
der benutzerdefinierten Ansicht zu Beginn einen Fix vor, statt wrap_content
oder fill_parent
____.
Nachdem Sie die Breite der benutzerdefinierten Ansicht festgelegt haben, sollten Sie die Bildlaufbreite festlegen.
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();
Wahrscheinlich
setMinimumHeight(width);
setMinimumWidth(height);
im Konstruktor nicht gesetzt oder onMeasure()
wird nicht überschrieben.
Dies ist ein weiterer Grund, warum Ihre Ansicht möglicherweise nicht angezeigt wird. Wenn Sie eine benutzerdefinierte Ansichtsgruppe mit Unteransichten erstellen, müssen Sie daran denken, die Teilansichten Ihrer Ansichtsgruppe hinzuzufügen.
In Ihrem ViewGroup-Konstruktor-Aufruf
addView(mySubView);
Denken Sie auch daran, Ihre Unteransichten in onLayout()
zu messen und zu gestalten.
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
mySubview.measure(...);
mySubview.layout(...);
}
Obwohl ich neu in Android bin, glaube ich immer noch, dass das Problem daran liegt
setContentView(R.layout.xmllayout);
Anstelle von "R.layout.xmllayout"
übergeben Sie MyDrawableView
object (mit findViewById
) und prüfen Sie .
Sie müssen invalidate () in der Konstruktormethode verwenden, um den Aufruf von onDraw zu erhalten.