java - ver - El editor de diseño de Android Studio no puede representar vistas personalizadas
vista diseño android studio (5)
Como me enteré hoy, por fin, los errores de "Classdef no encontrado", etc. durante la representación del diseño son en realidad engañosos. Lo que realmente quieren decir es que hay algún error durante la ejecución de su widget.
La forma más sencilla de averiguar dónde exactamente se encuentra el problema es esta:
En su archivo de diseño XML, reemplace su clase de vista personalizada (llamémosla "MyFrameLayout" por claridad) con la clase de stock de Android (por ejemplo, con FrameLayout) y asegúrese de que el Editor de diseños funcione. Agregue atributos de "herramientas: ..." para que pueda ver el contenido, no un diseño vacío. Por ejemplo, si tiene el widget EditText en su vista personalizada, agregue este atributo, que se usará solo en modo Diseño:
tools:text="Sample content"
("herramientas: el espacio de nombre es agregado por Android Studio automáticamente)
- Devuelva su nombre de clase original (por ejemplo, "MyFrameLayout") al diseño XML. ¿Funciona ahora?
Si no:
Copie la definición de su vista personalizada a una nueva clase temporal (por ejemplo, "MyFrameLayoutBeforeFix"), para mayor comodidad. Lo usará para compararlo con la clase "MyFrameLayout", que comenzará a modificar ahora.
Recrear su clase "MyFrameLayout" desde cero, utilizando Android Studio, comenzando con un mínimo absoluto: debe compilarse. Como resultado, la clase Java contendrá "extends" FrameLayout "y 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); } }
Asegúrese de que esta vista personalizada se muestre normalmente. ¡Debería, al menos en el año 2016!
Mueva el código pieza por pieza desde una copia "MyFrameLayoutBeforeFix" a esta clase, verificando que no haya errores en cada paso ...
La secuencia anterior parece obvia pero funcionó para mí. El truco es que el Editor de diseño inicia su clase en su propio contexto, y esto puede causar algunos errores inesperados en su código, que "funciona" cuando se inicia desde el interior de la aplicación ...
Otro truco es usar isInEditMode()
verificar el código de su widget para omitir partes, que pueden no funcionar en la vista Diseño. P.ej:
MyClass myClass = isInEditMode() ? null : MyClass.getInstance();
En Android Studio, el editor de diseño no puede previsualizar vistas personalizadas en xml.
Ejemplo muy simple:
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 renderizado
Las siguientes clases no pudieron ser encontradas:
- com.myprojectxxx.view.MyCustomView (Fix Build Path, Create Class)
Consejo: intente construir 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, nada cambia.
Y, sí, el proyecto funciona muy bien en mi dispositivo Android. Además, se procesa muy bien en Eclipse ADT. Sin embargo, en Android Studio, siempre dice que "LAS CLASES NO PUEDEN ENCONTRARSE".
¿Android Studio no tiene la capacidad de previsualizar un archivo xml con vistas personalizadas? ¿Qué pasa con esto?
Debería ser arreglado por la siguiente confirmación.
Enfrentando el mismo problema, tuve que anular los constructores de argumento tres y cuatro:
public View(Context context, AttributeSet attrs, int defStyle) public View(Context context, AttributeSet attrs, int defStyle, int defStyleRes)
Luego reconstruye el proyecto.
Los componentes de vista personalizada también son compatibles y se muestran correctamente en IDEA, pero dado que IntelliJ IDEA utiliza archivos de clase de su directorio de salida para representar dichos componentes, primero tiene que hacer build-> make project en su proyecto.