2012-05-24 11 views
11

In meinen Anwendungen verlasse ich mich oft auf benutzerdefinierte Build-Ansichten, wie im folgenden Beispiel.Benutzerdefinierte Android-Ansichten in Eclipse Visual Editor

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:background="@color/light_grey" 
android:layout_height="match_parent" 
android:layout_width="fill_parent" > 

<TextView 
style="@style/CardTitle" 
android:id="@+id/card_title" 
android:layout_height="wrap_content" 
android:layout_width="fill_parent"  
/> 

<com.whiterabbit.cards.ui.AspectRatioImageView 
    android:id="@+id/card_picture" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:adjustViewBounds="true" 
    android:layout_marginLeft="30dip" 
    android:layout_marginRight="30dip"  
    android:src="@drawable/boss" 
    /> 



<ListView 
    android:id="@+id/card_properties" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 

/> 

Das Problem ist, ich weiß nicht, wie wenn es richtig angezeigt wird, bis ich es auf einem realen Gerät oder auf dem Emulator ausgeführt werden. Außerdem, wenn ich etwas falsch gefunden habe, müsste ich Änderungen daran vornehmen und die App erneut bereitstellen, um zu sehen, ob die Änderungen wie erwartet funktionieren.

Dies kann ein langwieriger und langweiliger Prozess sein, insbesondere wenn die Anwendung eine Interaktion erfordert, um zu der Aktivität zu gelangen, die Sie überprüfen möchten.

Die Verwendung des visuellen Editors funktioniert nicht, da die benutzerdefinierte Ansicht nicht geladen werden kann.

Gibt es eine andere Möglichkeit zu überprüfen, wie Ansichten angezeigt werden, ohne über die gesamte Anwendung zu laufen?

+0

Dank @Blundell meine Frage für die Überarbeitung – fedepaol

Antwort

54

Sie dies tun können in Ihrer benutzerdefinierten Ansicht:

if(!isInEditMode()){ 
    // Your custom code that is not letting the Visual Editor draw properly 
    // i.e. thread spawning or other things in the constructor 
} 

http://developer.android.com/reference/android/view/View.html#isInEditMode()

Auf diese Weise können Sie Code aus dem ADT Plugin XML-Viewer verstecken und Sie hoffentlich ein Layout angezeigt werden!

View.isInEditMode()

Gibt an, ob diese Ansicht ist zur Zeit im Bearbeitungsmodus. Eine Ansicht ist normalerweise im Bearbeitungsmodus, wenn sie in einem Entwicklerwerkzeug angezeigt wird. Für Instanz, wenn diese Ansicht von einer visuellen Benutzeroberfläche Builder gezeichnet wird, sollte diese Methode True zurückgeben. Unterklassen sollten den Rückgabewert dieser Methode überprüfen, um unterschiedliche Verhaltensweisen zu erhalten, wenn ihr normales Verhalten die Host-Umgebung beeinträchtigen könnte. Für Instanz: die Klasse erzeugt einen Thread in seinem Konstruktor, die Zeichnung Code beruht auf gerätespezifischen Features, etc. Diese Methode ist in der Regel im Zeichnungscode von benutzerdefinierten Widgets überprüft.

0

Sie können eine Skelettaktivität erstellen, die nur die Ansicht lädt, die Sie sehen möchten, und sie mit genügend Daten füllen, um sie anzuzeigen.

0

Ich benutze Android Studio, also bin ich mir nicht sicher, ob diese Antwort auf Ihren Fall zutrifft.

Ich glaube, Sie OnDraw-Methode in der benutzerdefinierten Ansicht außer Kraft setzen könnten, wie diese exemple das Seitenverhältnis eines inneren Bild zu halten:

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    // TODO: consider storing these as member variables to reduce 
    // allocations per draw cycle. 
    int paddingLeft = getPaddingLeft(); 
    int paddingTop = getPaddingTop(); 
    int paddingRight = getPaddingRight(); 
    int paddingBottom = getPaddingBottom(); 

    int w = getWidth() - paddingLeft - paddingRight; 
    int h = getHeight() - paddingTop - paddingBottom; 

    w = w<h ? w : h; 
    h = w; 

    // Draw the example drawable on top of the text. 
    if (dieDrawable != null) { 
     dieDrawable.setBounds(paddingLeft, paddingTop, 
     paddingLeft + w, paddingTop + h); 
     dieDrawable.draw(canvas); 
    } 
} 

Dieses Verfahren läuft sowohl im Emulator und der Designer.

Es läuft auch für jedes Ereignis, das die Ansicht neu gezeichnet (OnSizeChanged, onLayout-, etc ...)