Eclipse Visual Editor中的自定义Android视图

时间:2012-05-24 18:11:33

标签: android eclipse android-layout adt 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"

/>

问题是,我不知道在真实设备或仿真器上运行它之前它是如何正确显示的。此外,如果我发现错误,我将不得不对其进行更改并再次部署应用程序以查看更改是否按预期工作。

这可能是一个漫长而无聊的过程,尤其是如果应用程序需要一些交互来访问您要检查的活动。

使用可视化编辑器不起作用,因为它无法加载自定义视图。

是否有其他方法可以检查视图的显示方式而无需在整个应用程序中运行?

3 个答案:

答案 0 :(得分:54)

您可以在自定义视图中执行此操作:

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

这允许您隐藏ADT插件XML查看器中的代码,并希望显示一个布局!

  

View.isInEditMode()

     

指示此视图当前是否处于编辑模式。一个观点是   通常在编辑模式下显示在开发人员工具中。对于   例如,如果此视图由可视用户界面绘制   builder,这个方法应该返回true。子类应检查   返回此方法的值,以提供不同的行为   正常行为可能会干扰主机环境。对于   instance:该类在其构造函数(即绘图)中生成一个线程   代码依赖于特定于设备的功能等。通常这种方法   检查自定义小部件的绘图代码。

答案 1 :(得分:0)

您可以创建一个骨架活动,只加载您想要查看的视图,并使用足够的数据填充它以使其显示。

答案 2 :(得分:0)

我正在使用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等等)