2011年10月27日 星期四

自行設計的可視元件在Eclipse的layout中報錯

程式執行正常, 可是在Eclipse的layout中報錯,



無法產生元件, 查看 Winodws > Show View > Error Log 可以看到
android.content.res.Resources$NotFoundException: String array resource ID #0x7f050001
 at android.content.res.Resources.getStringArray(Resources.java:385)
 at com.sni.Task.DateIcon.init(DateIcon.java:72)
 at com.sni.Task.DateIcon.<init>(DateIcon.java:47)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
 at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
 at com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.instantiateClass(ProjectCallback.java:387)
 at com.android.ide.eclipse.adt.internal.editors.layout.ProjectCallback.loadView(ProjectCallback.java:155)
 at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:198)
 at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:126)
 at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
 at android.view.LayoutInflater.rInflate(LayoutInflater.java:621)
 at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
 at android.view.LayoutInflater.inflate(LayoutInflater.java:296)
 at com.android.layoutlib.bridge.Bridge.computeLayout(Bridge.java:397)
 at com.android.ide.common.rendering.LayoutLibrary.createLegacySession(LayoutLibrary.java:492)
 at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:337)
 at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(GraphicalEditorPart.java:1510)
 at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.renderWithBridge(GraphicalEditorPart.java:1347)
 at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart.recomputeLayout(GraphicalEditorPart.java:1078)
 at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart$ReloadListener.reloadLayoutSwt(GraphicalEditorPart.java:1716)
 at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart$ReloadListener.access$0(GraphicalEditorPart.java:1654)
 at com.android.ide.eclipse.adt.internal.editors.layout.gle2.GraphicalEditorPart$ReloadListener$1.run(GraphicalEditorPart.java:1648)
 at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
 at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135)
 at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4140)
 at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3757)
 at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2696)
 at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2660)
 at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2494)
 at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:674)
 at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
 at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:667)
 at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
 at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:123)
 at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
 at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
 at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
 at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
 at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:597)
 at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622)
 at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577)
 at org.eclipse.equinox.launcher.Main.run(Main.java:1410)
 at org.eclipse.equinox.launcher.Main.main(Main.java:1386)

看這一長串可怕的資料, 其實指到一行:
weekDays = this.getResources().getStringArray(R.array.week_short);
(resource ID #0x7f050001)當然, 資源是有的, 否則程式不能執行正常, 但是在Eclipse的Layout中讀不到陣列的資料, 因此就報錯了, 發現, 所有使用Context的資料都會報錯, 解決的方法就是用 this.isInEditMode()包起來, 如:
if (! this.isInEditMode()) {
     ....(使用到Context的Code, 或是, 全部包起來)
}
然後就在Eclipse和執行都正常了, 當然, 是在constructor中使用.

沒有留言:

張貼留言