Estou tentando criar uma exibição personalizada GhostSurfaceCameraView
que se estende SurfaceView
. Aqui está o meu arquivo de definição de classe
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();
}
}
E isso está no meu ghostviewscreen.xml:
<com.alpenglow.androcap.GhostSurfaceCameraView android:id="@+id/ghostview_cameraview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
Agora na atividade que fiz:
protected void onCreate(Bundle savedInstanceState) {
try {
super.onCreate(savedInstanceState);
setContentView(R.layout.ghostviewscreen);
}
}
Quando setContentView()
é chamado, uma exceção é lançada:
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
Alguém pode me dizer por que recebo esse erro? Obrigado.
View is not using the 2- **OR** 3-argument View constructors
é meio enganosa.@ Tim - Ambos os construtores não são necessários, apenas o
ViewClassName(Context context, AttributeSet attrs )
construtor é necessário. Descobri isso da maneira dolorosa, depois de horas e horas perdidas.Sou muito novo no desenvolvimento do Android, mas estou fazendo um palpite aqui, que talvez seja devido ao fato de que, como estamos adicionando a
View
classe personalizada no arquivo XML, estamos definindo vários atributos no XML, o que precisa para ser processado no momento da instanciação. Alguém muito mais experiente que eu será capaz de lançar uma luz mais clara sobre esse assunto.fonte
Outra causa possível da mensagem "Erro ao inflar classe" pode estar digitando incorretamente o nome completo do pacote, onde está especificado em XML:
A abertura do arquivo XML de layout no editor XML do Eclipse deve destacar esse problema.
fonte
É importante escrever o caminho completo da classe no xml. Recebi 'Erro ao inflar a classe' quando apenas o nome da subclasse foi escrito.
fonte
Eu tive esse erro me atormentando nas últimas horas. Acontece que eu adicionei a lib de exibição personalizada como um módulo no Android Studio, mas deixei de incluí-la como uma dependência nos aplicativos
build.gradle
.fonte
fwiw , recebi esse erro devido a alguma inicialização personalizada dentro do construtor tentando acessar um objeto nulo.
fonte
Eu tive o mesmo problema ao estender um TextEdit. Para mim, o erro foi não adicionar "público" ao construtor. No meu caso, funciona mesmo se eu definir apenas um construtor, aquele com argumentos
Context
eAttributeSet
. O problema é que o bug só se revela quando eu construo um APK (chamuscado ou não) e o transfiro para os dispositivos. Quando o aplicativo é executado via AndroidStudio -> RunApp em um dispositivo conectado por USB, o aplicativo funciona.fonte
no meu caso, adicionei esse recurso cíclico:
então mudou para
e funcionou
fonte
No meu caso, copiei minha classe de outro lugar e não percebi imediatamente que era uma
abstract
aula. Você não pode inflar classes abstratas.fonte
O que se deve entender aqui é o seguinte:
O construtor
ViewClassName(Context context, AttributeSet attrs )
é chamado ao inflar o customView via xml. Você vê que não está usando a nova palavra-chave para instanciar seu objeto, ou seja, não está fazendonew GhostSurfaceCameraView()
. Fazendo isso, você está chamando o primeiro construtor, iepublic View (Context context)
.Enquanto que ao inflar a visualização do XML, ou seja, ao usar
setContentView(R.layout.ghostviewscreen);
ou usarfindViewById
, você NÃO, você não! , o sistema Android chama oViewClassName(Context context, AttributeSet attrs )
construtor.Isso fica claro ao ler a documentação: "Construtor chamado ao inflar uma exibição do XML". Consulte: https://developer.android.com/reference/android/view/View.html#View(android.content.Context,%20android.util.AttributeSet)
Portanto, nunca se esqueça do polimorfismo básico e nunca se esqueça de ler a documentação. Isso economiza uma tonelada de dor de cabeça.
fonte