Как добавить пользовательский вид в макет?

У меня есть класс 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> 

Solutions Collecting From Web of "Как добавить пользовательский вид в макет?"

Вы должны указать полный путь своего класса, который расширяет представление,

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

Если я правильно помню, вам нужно предоставить больше конструкторов для использования представления из XML-файла (добавьте его в 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); } 

Обновление: фиксированный код.

Я, наконец, получил его здесь код 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); } } 

Вам нужно сделать это:

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

Поскольку ваш пользовательский View является внутренним классом в вашей Activity java-компилятор выдаст имя ActivityName$GraphicsView для этого класса. Вы не можете использовать это имя непосредственно как имя View в макете xml из- $ символа $ но вы можете сделать это следующим образом:

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

Где ActivityName – это имя активности, в которой объявлен класс GraphicsView .

 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> 

Это работает для меня и добавляет представление в 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); } }