我编写了一个自定义视图,将其放在布局XML中,然后我可以在ADT Graphical Layout Editor中预览它。我可以查看自定义视图,例如Google员工在Google I/O 2011: Android Development Tools中的行为。但是,我的自定义视图在预览中表现不正确(模拟器/设备没有问题,但我没有使用View.isInEditMode()
)。我认为变量的值有误,但我无法确认。我试过了:
android.util.Log.d()
LogCat
或Console
System.out.println()
LogCat
或Console
Toast.makeText().show()
NullPointerException
android.widget.Toast.show
throw new IllegalStateException(debugMessage)
(?!)
debugMessage
未出现在Error Log
((Activity)getContext()).setTitle(debugMessage)
设置活动标题
((Activity)getContext()).getWindow().setTitle(debugMessage)
设置窗口标题
NullPointerException
(window
是null
)动态添加TextView
final TextView textView = new TextView(getContext());
textView.setText(debugMessage);
this.addView(textView);
debugMessage
但我的布局已毁坏ViewGroup
答案 0 :(得分:6)
好问题!我也想知道。在布局编辑器中有一个很好的预览非常困难,而且当“isineditmode”为真时,它似乎很少关于你能做什么以及你不能做的文档(例如,在构造函数的传入AttributeSet中分析自定义XML属性)这些观点似乎没有用,等等。)。
我甚至在自定义视图中通过ID查找视图时遇到问题。像
这样简单的事情mTextView = (TextView)myLayout.findViewById(R.id.view_id);
充气后,我的自定义视图布局仅在从编辑器运行布局时返回null(即isineditmode()== true)。在手机上运行应用程序时,它可以正常工作。
我离开这里时,在布局编辑器中尝试更好地预览布局时,有什么帮助我:
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- 检查一些值以了解为什么有时我的自定义视图无法在编辑模式下实例化,或者检查是否可以在编辑模式下查询某些属性并了解其值。我在父布局中使用了一个特殊的textview,我的自定义视图将放置在该布局中,我将其隐藏并带有特殊标记:
<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>
此线性布局将是我的自定义视图的父级,以及我需要在布局编辑器中打开以便预览我的自定义视图的布局。 “调试”textview visibilty“消失了”所以如果不需要我不会打扰。 然后,当我需要检查某些内容时,我在自定义视图的java代码中执行以下操作:
if(isineditmode()){
TextView wDebugView = (TextView)this.getRootView().findViewWithTag("debug");
wDebugView.setVisibility(View.VISIBLE);
wDebugView.setText(Integer.valueOf(getPaddingTop()).toString());
}
在此示例中,我检查视图的属性,如顶部填充。
重要提示:您需要手动将要在“调试”视图中显示的值转换为String,否则它将崩溃并给您一个错误。
希望它有所帮助。
如果有人知道为什么通过id查找视图不起作用,那么任何帮助都会受到赞赏。
答案 1 :(得分:3)
我同意这令人沮丧。对我来说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;