Пользовательские представления Android в 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"

/>

Проблема в том, что я не знаю, как она будет отображаться правильно, пока я не запустил ее на реальном устройстве или на эмуляторе. Более того, если бы я нашел что-то не так, мне пришлось бы выполнять изменения на нем и снова развертывать приложение, чтобы увидеть, были ли изменения работать так, как вы ожидали.

Это может быть долгий и скучный процесс, особенно если приложение требует некоторого взаимодействия, чтобы получить активность, которую вы хотите проверить.

Использование визуального редактора не работает, так как оно не может загрузить пользовательский вид.

Есть ли другой способ проверить, как отображаются представления, не пробегая по всему приложению?

Ответ 1

Вы можете сделать это в своем пользовательском представлении:

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()

Это позволяет скрыть код из модуля просмотра XML-плагинов ADT и, надеюсь, отобразит ваш макет!

View.isInEditMode()

Указывает, находится ли этот вид в настоящее время в режиме редактирования. Взгляд является обычно в режиме редактирования, когда отображается в инструменте разработчика. Для экземпляр, если этот вид рисуется визуальным пользовательским интерфейсом строитель, этот метод должен возвращать true. Подклассы должны проверять возвращаемое значение этого метода для обеспечения различного поведения, если их нормальное поведение может помешать среде хоста. Для instance: класс порождает поток в своем конструкторе, рисунок код зависит от особенностей устройства и т.д. Этот метод обычно проверен в коде чертежа пользовательских виджетов.

Ответ 2

Вы можете создать операцию скелета, которая загружает только представление, которое вы хотите просмотреть, и заполнить его достаточным количеством данных, чтобы он отображался.

Ответ 3

Я использую Android Studio, поэтому я не уверен, что этот ответ будет применен к вашему делу.

Я думаю, что вы можете переопределить метод onDraw в пользовательском представлении, например, чтобы сохранить пропорции внутреннего изображения:

@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);
    }
}

Этот метод работает как в эмуляторе, так и в дизайнере.

Он также работает для любого события, которое перерисовывает представление (onSizeChanged, onLayout и т.д.)