2012-05-02 16 views
10

GraphicsViewクラスをViewクラスから拡張しています。このGraphicsViewクラスをプロジェクトのメインレイアウトに追加します。どうやってやるの?レイアウトにカスタムビューを追加するにはどうすればよいですか?

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

と私の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

私はこれを置く必要がありましたか? – AnasBakez

答えて

17

ビューを拡張するクラスの完全なパスを与える必要があり、

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

それは私に例外を与えている! GraphicsViewクラスはアクティビティクラス内にあります – AnasBakez

+0

GraphicsViewクラスのために別のクラスを作成します。 –

+2

これはまだ私に例外を与えています。com.genie.customfonts.namespace.GraphicsView android:id = "@ + id/view" android:layout_width = "fill_parent" android:layout_height = "wrap_content"/> – AnasBakez

4

あなたがこれを実行する必要があります。

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

あなたのcusto m Viewは、Activityの内部クラスです。javaコンパイラは、そのクラスの名前ActivityName$GraphicsViewを出力します。あなたは理由$文字のXMLレイアウトにView名として直接その名前を使用することはできませんが、あなたはこのようにそれを行うことができます。ActivityNameはあなたのGraphicsViewクラスが宣言されているアクティビティの名前です

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

+0

私はクラスを別々のファイルに入れました。クラスcom.gen.customfonts.namespace.GraphicsViewでエラーが発生しました。クラス名に問題があると思います!!パッケージ名はpackage gen.customfonts.namespaceです。私はXMLでクラスを呼び出す必要がありますか? – AnasBakez

+0

@AnasBakezアクティビティに以前持っていた 'GraphicsView'クラスを残してみましたが、私の答えのコードを使用しましたか?また、Viewスーパークラスの他の2つのコンストラクタを実装する必要があります。 – Luksprog

+0

私はそれを試みましたが、何もしていません! GraphicsViewクラスのビューは表示されませんが、例外を出すことはありません、私はクラス名のiamパッティングがエラーだと思います。パッケージ名はpackage gen.customfonts.namespaceです。アクティビティ名はCustomFontsActivityです。クラス名は何であるべきですか? – AnasBakez

12

私が正しく覚えていれば、XMLファイルからのビューを使用するために、より多くのコンストラクタを提供する必要があります(「MeとWe」などのxmlファイルに追加してください)。

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

更新:固定コード。

+0

ありがとう、これは非常に役に立ちました。 – 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:私はfinalyここでそれを得た

<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

は、コード 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"/> 

とクラスです

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

これは私にとってはうまくいき、完全なパスでXML形式でビューを追加して、高さと幅にwrapcontentを与えるようにしてください。

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); 
    } 
} 
関連する問題