2010-07-27 24 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> 

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)); 
    } 

} 

Estoy poniendo un punto de ruptura, pero punto de interrupción no es golpeado en el interior onDraw() método, lo que está mal?onDraw personalizada() no se llama

+0

¿Cuál es el código de tu actividad? tal vez el problema está ahí? – Sephy

+0

MyActivity clase pública se extiende Actividad { \t // El miembro de su declaración de variables aquí \t // Se llama cuando se crea por primera vez la actividad. \t @ Override \t public void onCreate (Bundle savedInstanceState) { \t \t // El código aquí \t \t super.onCreate (savedInstanceState); \t \t setContentView (R.layout.xmllayout); \t \t LinearLayout svll = (LinearLayout) findViewById (R.id.svLL); \t \t svll.setLayoutParams (new LinearLayout.LayoutParams (300, 300)); \t} } – mynameisanthpny

+0

me trasladó su código en la cuestión, por lo que es más comprensible –

Respuesta

33

Su vista tiene una altura de 0. Establece su Vista para tener height=wrap_content, pero no anule onMeasure() para indicarle al UI el tamaño de su Vista.

0

Aunque soy nuevo en Android, todavía creo que el problema se debe a

setContentView(R.layout.xmllayout); 

En lugar de "R.layout.xmllayout", pasar MyDrawableView objeto (usando findViewById) y comprobar. No lo he intentado, pero espero que funcione.

3

Solo haga que layout_width y layout_height de la vista personalizada arreglen algo en el momento inicial en lugar de wrap_content o fill_parent. Eso funcionó para mí.

68

Agregar setWillNotDraw(false) en MyDrawableView constructor. La respuesta original es here.

+11

Esto aplica para ver grupo no ver –

+0

y yo puede confirmar que funciona maravillosamente! –

+0

Trabajó para un RelativeLayout extendido, gracias :) – wblaschko

14

Necesita @Override el método para especificar el tamaño de su vista llamando al setMeasuredDimension(int,int).

Si no lo hace, el método predeterminado configurará su vista para que tenga el tamaño width=0 height=0. Y, por lo tanto, ni siquiera intente llamar al onDraw.

El método OnMeasure llama a setMeasuredDimension(int,int) que indica qué tan grande es su vista.

(Así que debe obtener el tamaño de la pantalla de Android en el método OnMeasure y llame al setMeasuredDimension en consecuencia).

+0

De hecho, cuando las dimensiones son 0, entonces no se llama a onDraw(). Estaba usando getSuggestedMinimumWidth() que devolvió 0. Luego lo usé con setMeasuredDimension() para hacer un cuadrado ... no hace falta decir que no se llamó a onDraw(). –

0

Necesita usar invalidate() en el método constructor para obtener el onDraw llamado.

0

Después de establecer el ancho de la vista personalizada, debe establecer el ancho de desplazamiento.

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

Probablemente

setMinimumHeight(width); 
setMinimumWidth(height); 

en el constructor no está ajustada o onMeasure() no está anulado.