2012-05-02 16 views
10

Tengo una clase GraphicsView que se extiende desde la clase View y quiero agregar esta clase GraphicsView al diseño principal de mi proyecto. ¿Cómo puedo hacer eso?¿Cómo agregar una vista personalizada al diseño?

static public class GraphicsView extends View { 
     public GraphicsView(Context context) { 
     super(context); 
     } 
     @Override 
     protected void onDraw(Canvas canvas) { 
     // Drawing commands go here 
      Path rect = new Path(); 
      rect.addRect(100, 100, 250, 50, Direction.CW); 
      Paint cPaint = new Paint(); 
      cPaint.setColor(Color.LTGRAY); 
      canvas.drawPath(rect, cPaint); 
     } 
    } 

y mi main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/linnnnlayout" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" /> 

    <TextView 
     android:id="@+id/Customfont" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="@string/hello" /> 

    <View 
     android:id="@+id/view" 
      android:layout_width="fill_parent" 
     android:layout_height="wrap_content"/> 

</LinearLayout> 
+1

View.addView (yourView); – mihail

+0

donde tuve que poner esto? – AnasBakez

Respuesta

17

necesario para la administración ruta completa de su clase que se extiende Vista,

<com.blah.blah.GraphicsView 
     android:id="@+id/view" 
      android:layout_width="fill_parent" 
     android:layout_height="wrap_content"/> 
+0

me está dando una excepción! la clase GraphicsView está dentro de la clase de actividad – AnasBakez

+0

Crea una clase separada para la clase GraphicsView. –

+2

todavía me está dando excepciones aquí está el código AnasBakez

4

que tiene que hacer esto:

LinearLayout v = (LinearView) findViewById(R.id.linnnnlayout); 
GraphicsView myView = new myGraphicsView(this); 
v.addView(myView); 
4

Porque su custo m View es una clase interna en su Activity el compilador java mostrará el nombre ActivityName$GraphicsView para esa clase. No se puede utilizar ese nombre directamente como el nombre View en el diseño xml debido al carácter $ pero se puede hacer así:

<view 
    class="com.package.here.ActivityName$GraphicsView" 
    android:id="@+id/view" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"/> 

donde ActivityName es el nombre de la actividad en la que se declara la clase GraphicsView .

+0

he puesto la clase en un archivo separado. pero iam tiene una excepción que dice Error al inflar la clase com.gen.customfonts.namespace.GraphicsView ¡¡¡creo que tengo un problema en el nombre de la clase !!el nombre del paquete es el paquete gen.customfonts.namespace; ¿Cómo debo llamar a la clase en el xml? – AnasBakez

+0

@AnasBakez ¿Has intentado abandonar la clase 'GraphicsView' donde la tenías previamente, en la actividad, y usar el código de mi respuesta? También debería implementar los otros 2 constructores de la superclase de View. – Luksprog

+0

¡Lo había intentado pero no está haciendo nada! la vista en la clase GraphicsView no está visible, pero no está dando una excepción, creo que el nombre de clase iam putting es un error. el nombre del paquete es el paquete gen.customfonts.namespace; el nombre de la actividad es CustomFontsActivity, ¿cuál es el nombre de la clase? – AnasBakez

12

Si no recuerdo mal, debe proporcionar más constructores para utilizar la vista desde el archivo xml (agréguelo al archivo xml como "Me and We" sugerido).

public GraphicsView(Context context) { 
    super(context); 
} 

public GraphicsView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public GraphicsView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

Actualización: código fijo.

+0

Gracias, esto fue muy útil. – SingularityFuture

0
public class MainActivity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 


    LinearLayout v = (LinearLayout) findViewById(R.id.linearLayout); 
    MyGraphics myView = new MyGraphics(this); 
    v.addView(myView); 
} 
} 


public class MyGraphics extends View { 
public MyGraphics(Context context) { 
    super(context); 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    // Drawing commands go here 
    Path rect = new Path(); 
    rect.addRect(100, 100, 250, 50, Direction.CW); 
    Paint cPaint = new Paint(); 
    cPaint.setColor(Color.LTGRAY); 
    canvas.drawPath(rect, cPaint); 
} 


} 

XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" 
android:id="@+id/linearLayout"> 

<TextView 
    android:id="@+id/Customfont" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello" /> 


</LinearLayout> 
6

tengo finaly aquí es el código el código XML

<com.customfonts.namespace.BreakDownBar 
     android:id="@+id/gview" 
      android:layout_width="fill_parent" 
     android:layout_height="20dip" 
     android:layout_marginLeft="10dip" 
     android:layout_marginRight="10dip" 
     android:background="@color/BreakDownBarBack"/> 

y la clase

package com.customfonts.namespace; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.Path.Direction; 
import android.util.AttributeSet; 
import android.view.View; 



public class BreakDownBar extends View { 

    public BreakDownBar(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

     @Override 
     protected void onDraw(Canvas canvas) { 
       //Draw rectangle; 
       Path rect = new Path(); 
       rect.addRect(0, 0,250, 150,Direction.CW); 
       Paint cpaint = new Paint(); 
       cpaint.setColor(Color.GREEN); 
       canvas.drawPath(rect, cpaint); 
     } 
} 
0

Esto está funcionando para mí y agrega la vista en XML con la ruta completa y prueba a dar contenido por alto y ancho.

public class RectangleView extends View { 
    public RectangleView(Context context) { 
     super(context); 
    } 

    public RectangleView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public RectangleView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     Paint paint = new Paint(); 
     paint.setColor(Color.GRAY); 
     canvas.drawColor(Color.BLUE); 
     canvas.drawRect(10,10,50,50, paint); 
    } 
} 
Cuestiones relacionadas