Android – Использование пользовательского SurfaceView в макете XML

У меня такой простой макет:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <SurfaceView android:id="@+id/surfaceView1" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight = "1" /> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="button1" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="button2" /> </LinearLayout> </LinearLayout> 

Это соответствует требованиям, и приложение работает отлично. Я хотел заменить общий SurfaceView своим собственным SurfaceView:

 import android.content.Context; import android.view.SurfaceHolder; import android.view.SurfaceView; public class PuzzleView extends SurfaceView implements SurfaceHolder.Callback { public PuzzleView(Context context) { super(context); // TODO Auto-generated constructor stub } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub } } 

И используйте это в макете xml:

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

Как только действие создается, я получаю исключение:

 public class MyActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.game); } 10-29 19:56:25.921: E/AndroidRuntime(287): java.lang.RuntimeException: Unable to start activity ComponentInfo{ybz.pack1/ybz.pack1.MyActivity}: android.view.InflateException: Binary XML file line #7: Error inflating class PuzzleView 

Это запрещено. Я не могу найти примеров для этого.

Изменить :
Кроме того, решение, приведенное ниже, также требует добавления всех конструкторов SurfaceView в PuzzleView:

 public PuzzleView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } public PuzzleView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } 

Solutions Collecting From Web of "Android – Использование пользовательского SurfaceView в макете XML"

В вашем макете xml вы также должны написать пакет (где вы объявите свой класс) следующим образом:

 <com.your.package.here.PuzzleView android:id="@+id/surfaceView1" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight = "1" /> 

Я хотел бы составить реальное решение для другого ответа, так как сначала прочитал раздел « Изменить » в исходном вопросе.

Вот две вещи, которые вам нужно сделать:

  1. Сначала (ответ от @luksprog )

В вашем макете xml вы также должны написать пакет (где вы объявите свой класс) следующим образом:

 <com.your.package.here.PuzzleView android:id="@+id/surfaceView1" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight = "1" /> 
  1. Второй (Edit from @Yoav )

В противном случае решение, приведенное ниже, также необходимо добавить все конструкторы SurfaceView в PuzzleView:

 public PuzzleView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } public PuzzleView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub }