<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));
}
}
Je mets un point d'arrêt, mais le point d'arrêt n'est jamais touché dans la méthode onDraw()
, qu'est-ce qui ne va pas?
Ajoutez setWillNotDraw(false)
dans le constructeur MyDrawableView. La réponse originale est ici .
Votre vue a une hauteur de 0. Vous définissez votre vue sur height=wrap_content
, mais vous ne remplacez pas onMeasure()
pour indiquer à la boîte à outils de l'interface utilisateur la taille de votre vue.
Vous devez @Override
la méthode OnMeasure(int, int)
pour spécifier la taille de votre vue en appelant setMeasuredDimension(int,int)
.
Si vous ne le faites pas, la méthode par défaut définira votre vue sur la taille width=0 height=0
. Et par conséquent, n'essayez même pas d'appeler onDraw
.
La méthode OnMeasure
appelle setMeasuredDimension(int,int)
qui indique la taille de votre vue.
(Vous devez donc connaître la taille de l'écran Android avec la méthode OnMeasure
et appeler setMeasuredDimension
en conséquence).
Il suffit de créer layout_width
et layout_height
de la vue personnalisée avec un correctif initial au lieu de wrap_content
ou fill_parent
. Cela a fonctionné pour moi.
Après avoir défini la largeur de la vue personnalisée, vous devez définir la largeur de défilement.
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();
Probablement
setMinimumHeight(width);
setMinimumWidth(height);
dans le constructeur ne sont pas définis ou onMeasure()
n'est pas remplacé.
Voici une autre raison pour laquelle votre vue pourrait ne pas apparaître. Si vous créez votre ViewGroup personnalisé avec des sous-vues, n'oubliez pas d'ajouter les sous-vues à votre ViewGroup.
Dans votre appel de constructeur ViewGroup
addView(mySubView);
Pensez également à mesurer et à disposer vos vues secondaires dans onLayout()
.
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
mySubview.measure(...);
mySubview.layout(...);
}
Bien que je sois nouveau dans Android, je pense toujours que le problème vient de
setContentView(R.layout.xmllayout);
Au lieu de "R.layout.xmllayout"
, passez l'objet MyDrawableView
(à l'aide de findViewById
) et vérifiez ..__ Je n'ai pas essayé, mais j'espère que cela fonctionnera.
Vous devez utiliser invalidate () dans la méthode constructeur pour obtenir l'appel appelé onDraw.