【问题标题】:How to Debug Custom View in ADT's Graphical Layout Editor如何在 ADT 的图形布局编辑器中调试自定义视图
【发布时间】:2013-01-05 03:43:59
【问题描述】:

如何使用 ADT Eclipse 插件在布局 XML 的图形预览中调试自定义视图?


我写了一个自定义视图,把它放在一个布局 XML 中,我可以在 ADT Graphical Layout Editor 中预览它。我可以查看我的自定义视图,就像 Google 人员在 Google I/O 2011: Android Development Tools 中所做的那样。但是,我的自定义视图在预览中表现错误(在模拟器/设备上没有问题,但我没有使用View.isInEditMode())。我认为变量的值错误,但我无法确认。我试过了:

【问题讨论】:

    标签: android eclipse android-layout adt android-custom-view


    【解决方案1】:

    好问题!我也想知道。在布局编辑器中进行良好的预览确实非常困难,而且当“isineditmode”为真时,关于您可以做什么和不能做什么的文档似乎很少(例如,在构造函数的传入 AttributeSet 中分析自定义 XML 属性的视图似乎不起作用,等等)。

    我什至无法在自定义视图中按 ID 查找视图。一个简单的事情,比如

    mTextView = (TextView)myLayout.findViewById(R.id.view_id);
    

    仅当从编辑器运行布局时(即 isineditmode() == true),我的自定义视图布局膨胀后才返回 null。在手机上运行应用程序时,它可以工作。

    我把你留在这里是什么帮助了我在布局编辑器中更好地预览我的布局:

    1- 查找视图:我使用 TAG 属性,因为 findViewWithTag() 函数在编辑模式下确实有效。所以我使用ID作为标签

    <TextView
        android:id="@+id/myTextViewId"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ...
        android:tag="mytextViewId" />
    

    然后使用标签查找视图:

    if(isineditmode()){
        ((TextView)myLayout.findViewWithTag("myTextViewId")).setText("Test text");
    }
    

    2- 检查一些值以了解为什么有时我的自定义视图无法在编辑模式下实例化,或者检查某些属性是否可以在编辑模式下查询并知道它们的值。我在将放置我的自定义视图的父布局中使用了一个特殊的文本视图,我将其隐藏并带有一个特殊的标签:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" > 
    
        ...
    
        <com.example.myCustomView ... />
    
        ...
    
        <TextView
            android:id="@+id/DebugView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" 
            android:tag="debug"
            android:textSize="16sp"
            android:textColor="#FFFFFF"
            android:visibility="gone"
         />
    
    </LinearLayout>
    

    这个线性布局将是我的自定义视图的父级,我需要在布局编辑器中打开它才能预览我的自定义视图。 “调试”文本视图可见性已“消失”,因此如果不需要,我不会打扰。 然后,当我需要检查某些内容时,我会在自定义视图的 java 代码中执行以下操作:

    if(isineditmode()){
        TextView wDebugView = (TextView)this.getRootView().findViewWithTag("debug");
        wDebugView.setVisibility(View.VISIBLE);
        wDebugView.setText(Integer.valueOf(getPaddingTop()).toString());
    }
    

    在本例中,我检查了视图的属性,例如顶部填充。

    重要提示:您需要手动将值转换为字符串以显示在“调试”视图中,否则它将崩溃并给您一个错误。

    希望对你有帮助。

    如果有人知道为什么按 id 查找视图不起作用,我们将不胜感激。

    【讨论】:

    • 感谢使用标签的提示!现在我在 Android Studio 中的 Preview 可以正常工作了。
    【解决方案2】:

    我同意这令人沮丧。对我来说 findViewWithTag() 不起作用,它在 ADT 预览模式下总是返回 null 。但是我能够将一个简单的日志设置到本地(非 Android)文件并对其进行尾部调试,以调试我的自定义视图,例如如下(这会检查 isEditMode 以确保如果在 Android 中意外运行它是空操作):

    /** ONLY FOR ECLIPSE: enables us to do some basic logging to a file to debug our custom views in Eclipse preview mode */ 
    public static void eclipseEditModeLog(View view, String s) {
        if (view.isInEditMode()) {
            try {
                // Open our hack log file in append mode
                if (eclipseLogOut == null) {
                    File eclipseLogFile = new File("/home/mwk/tmp/eclipse.log");
                    eclipseLogOut = new BufferedWriter(new FileWriter(eclipseLogFile, true));
                }
                eclipseLogOut.write(new Date().toLocaleString() + ": " + s + "\n");
                eclipseLogOut.flush();
            } catch (IOException e) {}
        }
    }
    private static BufferedWriter eclipseLogOut = null;
    

    【讨论】:

    • 理论上一个很好的解决方案,但是我在 Eclipse 日志中收到错误“渲染期间不允许写入访问”。请参阅code.google.com/p/android/issues/detail?id=67140 我尝试使用目录/文件权限并以管理员身份运行 ADT,但没有成功。
    • 这个对我有用,这让我松了一口气。不幸的是,它只工作了一次,我不知道为什么! (我的意思是:真的有一次!它在日志文件中写了一行,仅此而已)正在搜索...
    • 如果输出路径是临时文件夹,则此方法有效。如果它不是临时文件夹,则会引发“渲染期间不允许写入访问”错误。在 Android Studio 的设计器问题窗口中,它会显示“Failed path”和“Normal temp dir”,其中“Failed path”是错误路径。如果使用“Normal temp dir”作为输出路径,文件将在那里成功生成
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 2011-10-17
    • 2013-05-11
    • 1970-01-01
    相关资源
    最近更新 更多