2010-07-27 11 views
37
<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> 
genannt
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 einen Haltepunkt am setzen, sondern Breakpoint wird nie in onDraw() Methode getroffen, was ist los?Benutzerdefinierte OnDraw() -Methode nicht

+0

Wie lautet der Code Ihrer Aktivität? Vielleicht ist das Problem da? – Sephy

+0

Öffentliche Klasse MyActivity erweitert Aktivität { \t // Ihre Membervariablendeklaration hier \t // Wird aufgerufen, wenn die Aktivität zum ersten Mal erstellt wird. \t @Override \t public void onCreate (Bundle savedInstanceState) { \t \t // Ihr Code hier \t \t super.onCreate (savedInstanceState); \t \t setContentView (R.layout.xmllayout); \t \t LinearLayout svll = (LinearLayout) findViewById (R.id.svLL); \t \t svll.setLayoutParams (neue LinearLayout.LayoutParams (300, 300)); \t} } – mynameisanthpny

+0

ich Ihren Code in der Frage bewegt, so ist es verständlicher –

Antwort

33

Ihre Ansicht hat eine Höhe von 0. Sie legen Ihre Ansicht auf height=wrap_content fest, überschreiben jedoch nicht onMeasure(), um dem UI-Toolkit mitzuteilen, wie groß Ihre Ansicht ist.

0

Obwohl ich in android bin hier, noch glaube ich, das Problem ist, weil das

setContentView(R.layout.xmllayout); 

Statt "R.layout.xmllayout" passieren MyDrawableView Objekt (mit findViewById) und überprüfen. Ich habe es nicht versucht, aber hoffe, es wird funktionieren.

3

Machen Sie einfach layout_width und layout_height der benutzerdefinierten Ansicht einige Fix zum ersten Mal statt wrap_content oder fill_parent. Das hat für mich funktioniert.

68

Fügen Sie setWillNotDraw(false) in MyDrawableView-Konstruktor hinzu. Ursprüngliche Antwort ist here.

+11

Dies gilt Viewgroup nicht anzeigen –

+0

Und ich kann bestätigen, dass es wunderbar funktioniert! –

+0

Arbeitete für eine erweiterte RelativeLayout, danke :) – wblaschko

14

Sie müssen die @Override die OnMeasure(int, int) Methode, um die Größe Ihrer Ansicht anzugeben, indem Sie setMeasuredDimension(int,int) aufrufen.

Wenn dies nicht der Fall ist, legt die Standardmethode Ihre Ansicht auf die Größe width=0 height=0 fest. Versuchen Sie also nicht einmal, onDraw überhaupt anzurufen.

Die OnMeasure Methode ruft setMeasuredDimension(int,int) auf, die angibt, wie groß Ihre Ansicht ist.

(Sie müssen also die Größe des Android-Bildschirm auf die OnMeasure Methode und rufen Sie setMeasuredDimension entsprechend).

+0

In der Tat, wenn die Dimensionen 0 sind, wird onDraw() nicht aufgerufen. Ich benutzte getSuggestedMinimumWidth(), das 0 zurückgab. Ich benutzte dann das mit setMeasuredDimension(), um ein Quadrat zu bilden ... unnötig zu sagen, onDraw() wurde nicht angerufen. –

0

Sie müssen in der Konstruktormethode invalidate() verwenden, um die aufgerufene OnDraw zu erhalten.

0

Nachdem Sie die benutzerdefinierte Ansichtsbreite 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(); 
0

Wahrscheinlich

setMinimumHeight(width); 
setMinimumWidth(height); 

im Konstruktor nicht gesetzt ist oder onMeasure() nicht außer Kraft gesetzt.

Verwandte Themen