web-dev-qa-db-de.com

Der Layout-Editor von Android Studio kann keine benutzerdefinierten Ansichten darstellen

In Android Studio kann der Layout-Editor keine benutzerdefinierten Ansichten in XML anzeigen.

Sehr einfaches Beispiel:

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 sagt immer:

Probleme beim Rendern

Die folgenden Klassen konnten nicht gefunden werden:

  • com.myprojectxxx.view.MyCustomView (Erstellungspfad fixieren, Klasse erstellen)

Tipp: Versuchen Sie, das Projekt zu erstellen

Natürlich habe ich diese Klasse. Wenn ich auf "Klasse erstellen" klicke, wird das Vorhandensein derselben Klasse beanstandet. Wenn ich das Projekt neu aufbaue, ändert sich nichts.

Und ja, das Projekt funktioniert sehr gut auf meinem Android-Gerät. In Eclipse ADT wird es auch sehr gut dargestellt. In Android Studio heißt es jedoch immer, dass "KLASSEN NICHT GEFUNDEN WURDEN".

Android Studio kann keine XML-Datei mit benutzerdefinierten Ansichten in der Vorschau anzeigen? Was ist daran falsch?

44
Naetmul

Benutzerdefinierte Ansichtskomponenten werden auch in IDEA richtig unterstützt und angezeigt. Da IntelliJ IDEA Klassendateien aus Ihrem Ausgabeverzeichnis verwendet, um solche Komponenten zu rendern, müssen Sie zuerst ein Projekt für Ihr Projekt erstellen.

 enter image description here

Referenz

14
Badamchi Davoud

Angesichts des gleichen Problems musste ich die drei und vier Argumentkonstruktoren überschreiben:

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

Dann das Projekt neu aufbauen.

4
SleepyTonic

Wie ich heute herausgefunden habe, sind die Fehler "Classdef not found" usw. beim Rendern des Layouts irreführend. Was sie wirklich bedeuten ist, dass es einige Fehler während der Ausführung Ihres Widgets gibt.

Der einfachste Weg herauszufinden, wo genau das Problem liegt, ist:

  1. Ersetzen Sie in Ihrer XML-Layout-Datei Ihre benutzerdefinierte Ansichtsklasse (nennen wir sie der Übersichtlichkeit halber "MyFrameLayout") durch Android Aktienklasse (z. B. mit FrameLayout)) und stellen Sie sicher, dass der Layout-Editor funktioniert. ... "Attribute, mit denen Sie Inhalte und kein leeres Layout sehen können. Wenn Sie beispielsweise das EditText-Widget in Ihrer benutzerdefinierten Ansicht haben, fügen Sie dieses Attribut hinzu, das nur im Entwurfsmodus verwendet wird:

    tools:text="Sample content"
    

("tools: Namespace wird von Android Studio automatisch hinzugefügt)

  1. Geben Sie Ihren ursprünglichen Klassennamen (z. B. "MyFrameLayout") in das XML-Layout zurück. Funktioniert es jetzt?

Wenn nicht:

  1. Kopieren Sie die Definition Ihrer benutzerdefinierten Ansicht zur Vereinfachung in eine temporäre neue Klasse (z. B. "MyFrameLayoutBeforeFix"). Sie werden es zum Vergleich mit der Klasse "MyFrameLayout" verwenden, die Sie jetzt ändern werden.

  2. Erstellen Sie Ihre "MyFrameLayout" -Klasse von Grund auf neu, indem Sie Android Studio, beginnend mit dem absoluten Minimum: Es sollte kompiliert werden. Infolgedessen enthält die Java Klasse enthält ") "FrameLayout" und benötigte Konstruktoren/Methoden zB in diesem Fall:

    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. Stellen Sie sicher, dass diese benutzerdefinierte Ansicht normal gerendert wird. Es sollte zumindest im Jahr 2016 sein!

  4. Verschieben Sie Code Stück für Stück von einer "MyFrameLayoutBeforeFix" -Kopie in diese Klasse und überprüfen Sie, ob bei jedem Schritt Fehler aufgetreten sind ...

Die obige Reihenfolge ist offensichtlich, hat aber bei mir funktioniert. Der Trick besteht darin, dass der Layout-Editor Ihre Klasse in einem eigenen Kontext startet. Dies kann zu unerwarteten Fehlern in Ihrem Code führen, die beim Starten aus Ihrer Anwendung heraus "funktionieren".

Ein weiterer Trick besteht darin, isInEditMode() im Code Ihres Widgets zu verwenden, um Teile zu überspringen, die in der Entwurfsansicht möglicherweise nicht funktionieren. Z.B.:

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

4
yvolk

Sollte durch das folgende Commit festgelegt werden.

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

1
Naetmul

Es kann auch sein, dass Sie das falsche Design zum Rendern Ihrer Layouts verwenden. Vergewissern Sie sich, dass Sie diejenige auswählen, die Sie in Ihrem Projekt verwenden.

 enter image description here

0
Javier Mendonca