El editor de diseño de Android Studio no puede mostrar vistas personalizadas

En Android Studio, el editor de diseño no puede obtener una vista previa de vistas personalizadas en xml.

Ejemplo muy sencillo:

public class MyCustomView extends FrameLayout { public MyCustomView(Context context) { super(context); } public MyCustomView(Context context, AttributeSet attrs) { super(context, attrs); } public MyCustomView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } } 

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <com.myprojectxxx.view.MyCustomView android:layout_width="48dp" android:layout_height="48dp" /> </LinearLayout> 

Android Studio siempre dice:

Problemas de procesamiento

No se pudieron encontrar las clases siguientes:

  • Com.myprojectxxx.view.MyCustomView (arreglar la ruta de construcción, crear clase)

Sugerencia: Intente crear el proyecto

Por supuesto, tengo esa clase. Si hago clic en "Crear clase", se queja de que ya existe la misma clase. Si reconstruyo ese proyecto, no cambia nada.

Y, sí, el proyecto funciona muy bien en mi dispositivo Android. Además, se traduce muy bien en Eclipse ADT. Sin embargo, en Android Studio, siempre dice que "LAS CLASES NO PODRÍAN ENCONTRARSE".

Android Studio no tiene la capacidad de previsualizar un archivo xml con vistas personalizadas? ¿Qué tiene de malo esto?

Frente a la misma cuestión, tuve que anular los constructores de tres y cuatro argumentos:

public View(Context context, AttributeSet attrs, int defStyle) public View(Context context, AttributeSet attrs, int defStyle, int defStyleRes)

A continuación, vuelva a generar el proyecto.

Los componentes de vista personalizada también son compatibles y se muestran correctamente en IDEA, pero como IntelliJ IDEA utiliza archivos de clase de su directorio de salida para procesar dichos componentes, debe construir build-> make project en su proyecto primero.

Introduzca aquí la descripción de la imagen

referencia

Como descubrí hoy, por fin, los errores "Classdef no encontrado", etc. durante la representación de maquetación son en realidad engañosos. Lo que realmente significa es que hay algún error durante la ejecución de su widget.

La manera más sencilla de averiguar, donde exactamente el problema está, es esto:

  1. En su archivo de diseño XML, reemplace la clase de vista personalizada (llamémosla "MyFrameLayout" para mayor claridad) con Android stock class (por ejemplo, con FrameLayout) y asegúrese de que Layout Editor funcione. Agregue los atributos "tools: …" para que pueda ver el contenido, no un diseño vacío. Por ejemplo, si tiene el widget EditarTexto en su vista personalizada, agregue este atributo, que se utilizará sólo en modo Diseño:

     tools:text="Sample content" 

("Tools: namespace es añadido por Android Studio automáticamente)

  1. Devuelve el nombre de la clase original (por ejemplo, "MyFrameLayout") al diseño XML. ¿Funciona ahora?

Si no:

  1. Copie la definición de su vista personalizada a una nueva clase temporal (por ejemplo, "MyFrameLayoutBeforeFix"), por conveniencia. Lo usarás para compararlo con la clase "MyFrameLayout", que comenzarás a modificar ahora.

  2. Recrea tu clase "MyFrameLayout" desde cero, usando Android Studio, comenzando con un mínimo absoluto: debería compilar. Como resultado, la clase Java contendrá "extends" FrameLayout "y los constructores / métodos requeridos, por ejemplo, en este caso:

     package com.myprojectxxx.view; import android.content.Context; import android.util.AttributeSet; import android.widget.FrameLayout; public class MyFrameLayout extends FrameLayout { public MyFrameLayout(Context context) { super(context); } public MyFrameLayout(Context context, AttributeSet attrs) { super(context, attrs); } public MyFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } } 
  3. Asegúrese de que esta vista personalizada se procesa normalmente. Debería, por lo menos en el año 2016!

  4. Mueva el código pieza por pieza de una copia "MyFrameLayoutBeforeFix" a esta clase, comprobando que no hay errores en cada paso …

Por encima de la secuencia parece obvio, pero funcionó para mí. El truco es que Layout Editor inicia tu clase en su propio contexto, y esto puede causar algunos errores inesperados en tu código, que "funciona" cuando se inicia desde dentro de tu aplicación …

Otro truco es usar isInEditMode() en el código de su widget para saltarse las partes, que pueden no funcionar en la vista Diseño. P.ej:

MyClass myClass = isInEditMode() ? null : MyClass.getInstance();

Debe ser fijado por el siguiente commit.

https://android-review.googlesource.com/#/c/59090/

  • Last.fm no devolverá la imagen del artista
  • Cómo convertir la cadena en largo
  • No puedo pasar demasiado grande arraylist de objetos entre 2 actividades?
  • Sms ContentObserver onChange () se activa varias veces
  • Android ListView y ArrayAdapter / Arraylist
  • Osmdroid Bonuspack - MyLocationNewOverlay
  • Vaciar RecyclerView utilizando datos obtenidos de parse.com
  • ¿Por qué el botón Atrás no funciona en esta vista web de Android?
  • Java Android Studio aplicación, archivo de visualización de pdf dentro de la aplicación
  • Java REST cliente API para Android
  • Vinculación de bibliotecas de terceros (libs.a) con NDK
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.