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中使用.

2011年10月26日 星期三

Dialog 中的 ListView 只顯示文字長度

在Dialog中, 使用ListView, 乖乖, 選項只有半截, 或者說, 只有文字的長度, 選擇時, 也只能選擇文字所在的區域, 選擇後面的空白就變成無效的選擇, 如下圖:
怎麼會這樣, 一直都是好好的呀, 只好一行一行去試, 結果發現, 是 FEATURE_NO_TITLE,
只要設定這個選項時, 就會有這個錯誤, 如下例:
Dialog dlg = new Dialog(this);
dlg.requestWindowFeature(Window.FEATURE_NO_TITLE);

ArrayList<HashMap<String,Object>> laHelp=new ArrayList<HashMap<String,Object>>();
HashMap<String,Object> map=new HashMap<String,Object>();
map.put(HelpDialog.ICON_KEY, R.drawable.task_cancelled);
map.put(HelpDialog.TEXT_KEY, "test");
laHelp.add(map);
ListView lvw=new ListView(this);
lvw.setAdapter(new SimpleAdapter(this,laHelp, R.layout.help_item,
            new String[] {HelpDialog.ICON_KEY, HelpDialog.TEXT_KEY}, new int[] {R.id.HelpItemImage, R.id.HelpItemText} ));
dlg.setContentView(lvw);
dlg.show();
關鍵就在紅字那一行, 如果刪除, 就正常了, 但是多了抬頭, 怎麼辦呢? 我的方向就是不用SimpleAdapter, 改寫自己的 Adapter, 就正常了.

2011年10月20日 星期四

Re-indent

如果你的原代碼所有的指令都在一行, 只有一行, 很長的一行, 好啦, 許多行也行, 反正就是格式亂七八糟, 如何在Eclipse中排整齊,
使用 Ctrl-Shift-F, 如果有 "//" 就麻煩一點, 必須先將 // 刪除, 或是改成 /* ... */, Ctrl-Shift-F 的選項在,
Source / Format

http://stackoverflow.com/questions/1207264/how-do-i-reindent-all-my-codes-in-eclipse

2011年10月17日 星期一

query like

使用Android 的query指令時,
使用, "Title like ?%", new String[] { string }
或是, "Title like '?%'", new String[] { string }
都是錯誤的, 前者在全部符合時才傳回, 後者根本找不到,
或是改成, "Title like ?", new String { string+"%" }
就可以了,
異哉 !! (應該是 % 的處理, 但是改成 \% 則文法錯誤)

2011年10月13日 星期四

SQLite 的效能

要寫入近二百條的資料到數據庫, 很慢, 受不了, 後來查網路文章, 竟然後發, 將指令包在transaction之內, 就變得很快了, 差有百倍以上,
真是好.