Saya mencoba membuat tampilan khusus GhostSurfaceCameraView
yang diperluas SurfaceView
. Ini file definisi kelas saya
GhostSurfaceCameraView.java
:
public class GhostSurfaceCameraView extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
Camera mCamera;
GhostSurfaceCameraView(Context context) {
super(context);
// Install a SurfaceHolder.Callback so we get notified when the
// underlying surface is created and destroyed.
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
// The Surface has been created, acquire the camera and tell it where to draw.
mCamera = Camera.open();
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException exception) {
mCamera.release();
mCamera = null;
// TODO: add more exception handling logic here
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
// Surface will be destroyed when we return, so stop the preview.
// Because the CameraDevice object is not a shared resource, it's very
// important to release it when the activity is paused.
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// Now that the size is known, set up the camera parameters and begin
// the preview.
Camera.Parameters parameters = mCamera.getParameters();
parameters.setPreviewSize(w, h);
parameters.set("orientation", "portrait");
// parameters.setRotation(90); // API 5+
mCamera.setParameters(parameters);
mCamera.startPreview();
}
}
Dan ini ada di ghostviewscreen.xml saya:
<com.alpenglow.androcap.GhostSurfaceCameraView android:id="@+id/ghostview_cameraview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
Sekarang dalam aktivitas yang saya buat:
protected void onCreate(Bundle savedInstanceState) {
try {
super.onCreate(savedInstanceState);
setContentView(R.layout.ghostviewscreen);
}
}
Saat setContentView()
dipanggil, pengecualian dilemparkan:
Binary XML file 09-17 22:47:01.958: ERROR/ERROR(337):
ERROR IN CODE:
android.view.InflateException: Binary
XML file line #14: Error inflating
class
com.alpenglow.androcap.GhostSurfaceCameraView
Adakah yang bisa memberi tahu saya mengapa saya mendapatkan kesalahan ini? Terima kasih.
View is not using the 2- **OR** 3-argument View constructors
agak menyesatkan.@ Tim - Kedua konstruktor tidak diperlukan, hanya
ViewClassName(Context context, AttributeSet attrs )
konstruktor yang diperlukan. Saya menemukan ini dengan cara yang menyakitkan, setelah berjam-jam menghabiskan waktu.Saya sangat baru dalam pengembangan Android, tetapi saya membuat tebakan liar di sini, bahwa itu mungkin karena fakta bahwa kita menambahkan
View
kelas khusus dalam file XML, kita menetapkan beberapa atribut padanya dalam XML, yang perlu untuk diproses pada saat Instansiasi. Seseorang yang jauh lebih berpengetahuan dari saya akan dapat menjelaskan lebih jelas tentang masalah ini.sumber
Penyebab lain yang mungkin dari pesan "Error inflating class" bisa salah mengeja nama paket lengkap yang ditentukan dalam XML:
Membuka file XML layout Anda di editor Eclipse XML akan menyoroti masalah ini.
sumber
Sangat penting untuk menulis jalur kelas penuh di xml. Saya mendapat 'Kesalahan menggembungkan kelas' saat hanya nama subclass yang ditulis.
sumber
Saya memiliki kesalahan ini mengganggu saya selama beberapa jam terakhir. Ternyata, saya telah menambahkan lib tampilan kustom sebagai modul di Android Studio, tetapi saya lalai menambahkannya sebagai ketergantungan pada aplikasi
build.gradle
.sumber
fwiw , saya menerima kesalahan ini karena beberapa inisialisasi kustom dalam konstruktor yang mencoba mengakses objek nol.
sumber
Saya memiliki masalah yang sama dalam memperpanjang TextEdit. Bagi saya kesalahannya adalah saya tidak menambahkan "publik" ke konstruktor. Dalam kasus saya ini berfungsi bahkan jika saya mendefinisikan hanya satu konstruktor, satu dengan argumen
Context
danAttributeSet
. Masalah kabelnya adalah bahwa bug hanya muncul ketika saya membangun APK (hangus atau tidak) dan saya mentransfernya ke perangkat. Ketika aplikasi dijalankan melalui AndroidStudio -> RunApp pada perangkat yang terhubung USB, aplikasi tersebut berfungsi.sumber
dalam kasus saya, saya menambahkan sumber daya siklik seperti itu:
kemudian diubah menjadi
dan itu berhasil
sumber
Dalam kasus saya, saya menyalin kelas saya dari tempat lain dan tidak segera menyadari bahwa itu adalah
abstract
kelas. Anda tidak dapat mengembang kelas abstrak.sumber
Yang perlu dipahami di sini adalah:
Konstruktor
ViewClassName(Context context, AttributeSet attrs )
dipanggil ketika menggembungkan customView melalui xml. Anda melihat Anda tidak menggunakan kata kunci baru untuk membuat instance objek Anda yaitu Anda tidak melakukannyanew GhostSurfaceCameraView()
. Melakukan ini, Anda memanggil konstruktor pertama yaitupublic View (Context context)
.Sedangkan ketika menggembungkan tampilan dari XML, yaitu saat menggunakan
setContentView(R.layout.ghostviewscreen);
atau menggunakanfindViewById
, Anda, TIDAK, bukan Anda! , sistem android memanggilViewClassName(Context context, AttributeSet attrs )
konstruktor.Ini jelas saat membaca dokumentasi: "Konstruktor yang dipanggil ketika menggembungkan tampilan dari XML." Lihat: https://developer.android.com/reference/android/view/View.html#View(android.content.Context,%20android.util.AttributeSet)
Karenanya, jangan pernah lupakan polimorfisme dasar dan jangan pernah lupa membaca dokumentasi. Menghemat banyak sakit kepala.
sumber