??xml version="1.0" encoding="utf-8" standalone="yes"?>
通过搜烦,发现原来是JDK版本的问?我用的是JDK6,不好?使用JDK7好使了.
如果有多个JDK版本共存,可以使用在eclipse安装目录下的文geclipse.ini指定要用的JDK:
-vm
C:/Program Files/Java/jdk1.7.0_55/bin/javaw.exe
通过菜单Window->Preferences打开讄H口?/p>
其他如果有Editor的地?~进也都要改?个空? 比如: Web节点下面的CSS Files, HTML Files.
下蝲地址: http://windows.microsoft.com/zh-cn/windows-live/essentials-other#essentials=overviewother
* 使用Live Writer?strong>oschina上写Blog: http://my.oschina.net/javayou/blog/39107
* 使用Live Writer在BlogJava上鞋Blog: http://www.aygfsteel.com/vulcan/archive/2010/11/05/337323.html
注意: - 在日志类型中选择Metaweblog API
- APIq接? http://www.aygfsteel.com/你的blog名称/services/metaweblog.aspx
解决:
复制 build-tool/17.0.0/ 下所有内容到 platform-tools 目录?
参?
This Terminal Emulator is not functional because no 'bash' shell could be found. Please correct the problem and restart the IDE.
解决办法:
然后重启l端好?
在WebView控g?如果面中调用了javascript脚本console.log Ҏ,p用一个JavaҎ.
在Android的WebView控g?有一个setChromeClient(WebChromeClient)Ҏ,
此方法的参数是WebChromeClient对象,通过重蝲此对象中的onConsoleMessageҎ?/p>
可以辑ֈ此目?看代?
WebView webView = new WebView(); webView.setWebChromeClient(new DefaultWebChromeClient); // 以上代码攑֜在Activity或则Fragment中的onCreateҎ? private class DefualtWebChromeClient extends WebChromeClient { @Override public boolean onConsoleMessage(ConsoleMessage consoleMessage) { String message = consoleMessage.message(); int lineNumber = consoleMessage.lineNumber(); String sourceID = consoleMessage.sourceId(); String messageLevel = consoleMessage.message(); Log.i("[WebView]", String.format("[%s] sourceID: %s lineNumber: %n message: %s", messageLevel, sourceID, lineNumber, message)); return super.onConsoleMessage(consoleMessage); } @Override public void onConsoleMessage(String message, int lineNumber, String sourceID) { Log.i("[WebView]", String.format("sourceID: %s lineNumber: %n message: %s", sourceID, lineNumber, message)); super.onConsoleMessage(message, lineNumber, sourceID); } }
W一个方法onConsoleMessage(ConsoleMessage consoleMessage)是新版本的android才有的方?W二个方法是旧版本的.
W二个方法已l不推荐使用?但是在旧版本的android?仍然需要此Ҏ.所以最好两个方法都实现.
默认的实现在某些版本的手Z不好?onConsoleMessageҎL不被调用
使用WebView的addJavascriptInterfaceҎ:
// 首先,定一个类,叫什么名U都可以,但是里面的方法名必须? // Javascript的console中的Ҏ名对? private class Console{ private static final String TAG="[WebView]"; public void log(String msg){ Log.i(TAG,msg); } // q可以添加其他的Ҏ,比如: warn,assert{等 } // 然后,为WebViewd对应的接? webView.addJavascriptInterface(new Console, "console");
q个解决Ҏ有一个不好的地方,是输出的内Ҏ有onConsoleMessageҎ那么详细,比如行号,没法输?
所?我们应该在onConsoleMessage好的时候用onConsoleMessage,不好使的时候在使用我们自定义的方式.
那么,如何来判断onConsoleMessage是否好? 我们可以在程序初始化的时?先在WebView中运行一下console.log,
如果onConsoleMessageq行?添加一个标?表示默认的实现是好?
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // q些代码也可以放到onCreateҎ? this.webView = (WebView) layout.findViewById(R.id.webview); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); // Set WebChromeClient WebChromeClient webChromeClient = new TestConsoleMessageWebChromeClient(); // 先执行console.log,试是否调用了onConsoleMessage webView.loadUrl("javascript:console.log('testConsoleMessage')"); if (((TestConsoleMessageWebChromeClient)webChromeClient).isConsoleMessageOK()){ // q里额外使用了一个新的类 TestConsoleMessageWebChromeClient // 如果不适用TestConsoleMessageWebChromeClient,需要在 // DefaultWebChromeClient中添加标记字D?consoleMessageOK, // q样如果ҎonConsoleMessage好,那么每次都给consoleMessageOK赋? // q个有些多余,也媄响性能. webChromeClient = new DefualtWebChromeClient(); }else{ // onConsoleMessage不好?׃用这U方?W二个参数值必L"console" webView.addJavascriptInterface(new Console(), "console"); } webView.loadUrl("http://www.baidu.com"); return super.onCreateView(inflater, container, savedInstanceState); } // 当默认的onConsoleMessage不好使的时候用的c? private class Console { private static final String TAG = "[WebView]"; public void log(String msg) { Log.i(TAG, msg); } // q里q可以添加其他方法console对象中有的方?比如 assert } // 默认 private class DefualtWebChromeClient extends WebChromeClient { @Override public boolean onConsoleMessage(ConsoleMessage consoleMessage) { String message = consoleMessage.message(); int lineNumber = consoleMessage.lineNumber(); String sourceID = consoleMessage.sourceId(); String messageLevel = consoleMessage.message(); Log.i("[WebView]", String.format("[%s] sourceID: %s lineNumber: %n message: %s", messageLevel, sourceID, lineNumber, message)); return super.onConsoleMessage(consoleMessage); } @Override public void onConsoleMessage(String message, int lineNumber, String sourceID) { Log.i("[WebView]", String.format("sourceID: %s lineNumber: %n message: %s", sourceID, lineNumber, message)); super.onConsoleMessage(message, lineNumber, sourceID); } } // 用于试onConsoleMessage是否调用的类 private class TestConsoleMessageWebChromeClient extends WebChromeClient { private boolean consoleMessageOK = false; @Override public boolean onConsoleMessage(ConsoleMessage consoleMessage) { this.consoleMessageOK = true; return super.onConsoleMessage(consoleMessage); } @Override public void onConsoleMessage(String message, int lineNumber, String sourceID) { this.consoleMessageOK = true; super.onConsoleMessage(message, lineNumber, sourceID); } public boolean isConsoleMessageOK() { return this.consoleMessageOK; } }
1: // 方式一,q种方式多用了一个括?看着别扭
2: (function(param) {
3: alert(param);
4: })(10);
5:
6: // 方式?使用 ! 操作W?/span>
7: !function(param) {
8: alert(param);
9: }(10);
使用匿名立即执行函数的好处是,可以避免变量冲突.
1: //========================= 条g判断
2: var sabiable = true;
3: //普通方?/span>
4: if (sabiable) {
5: alert('You are sability!');
6: }
7:
8: //诡异方式,利用 ||?&& 操作W?/span>
9: // a||b : 只有在a为fasle或者返回false时才会执行b,当a为true?直接q回a,后面的b不会执行
10: // a&&b : 只有在a为true或者返回true时才会执行b,当a为时,直接q回a,后面的b不会执行
11:
12: // 上面的代码可以改?
13: sabiable && alert('You are sability!');
1: function ApplicationTabGroup(Window) {
2: //create module instance
3: var self = Ti.UI.createTabGroup();
4:
5: //create app tabs
6: var win1 = new Window(L('home')), win2 = new Window(L('settings'));
7:
8: var tab1 = Ti.UI.createTab({
9: title : L('home'),
10: icon : '/images/KS_nav_ui.png',
11: window : win1
12: });
13: win1.containingTab = tab1;
14:
15: var tab2 = Ti.UI.createTab({
16: title : L('settings'),
17: icon : '/images/KS_nav_views.png',
18: window : win2
19: });
20: win2.containingTab = tab2;
21:
22: self.addTab(tab1);
23: self.addTab(tab2);
24:
25: tab1.addEventListener('click',function(){
26: //q个事g在iOS中不会被触发
27: });
28:
29: return self;
30: };
31:
32: module.exports = ApplicationTabGroup;
解决Ҏ:
通过看Titanium附带的示例程?Kitcken Sink , 扑ֈ了解x?
为TabGroupdfocus事g,然后对事件参数进行判?来确定当前被点击的是那个tab.
1: function ApplicationTabGroup(Window) {
2: //create module instance
3: var self = Ti.UI.createTabGroup();
4:
5: //create app tabs
6: var win1 = new Window(L('home')), win2 = new Window(L('settings'));
7:
8: var tab1 = Ti.UI.createTab({
9: title : L('home'),
10: icon : '/images/KS_nav_ui.png',
11: window : win1
12: });
13: win1.containingTab = tab1;
14:
15: var tab2 = Ti.UI.createTab({
16: title : L('settings'),
17: icon : '/images/KS_nav_views.png',
18: window : win2
19: });
20: win2.containingTab = tab2;
21:
22: self.addTab(tab1);
23: self.addTab(tab2);
24:
25: self.addEventListener('focus', function(e) {
26:
27: var info = Titanium.API.info;
28:
29: // 在iOS? e.source ?TabGroup对象,
30: // 在Android?e.source ?Tab对象
31: var src = e.source;
32: var tab = e.tab;
33: var preTab = e.previousIndex;
34:
35: // e.tab 是当前获得焦点的tab
36: // e.index 当前获得焦点的tab的烦?首次?1
37: // e.previousTab 上个tab
38: // e.previousIndex 上个tab的烦?首次为null
39:
40: // On iOS, the "More..." tab is actually a tab container, not a tab. When it is clicked, e.tab is undefined.
41: if (!tab) {
42: info('在iOS中点M"More..."');
43: return;
44: }
45:
46: // 首次
47: if (!preTab) {
48: info('首次q入');
49: return;
50: }
51:
52: if (tab === tab1) {
53: info('点击了tab1');
54: } else if (tab === tab2) {
55: info('点击了tab2');
56: }
57: });
58:
59: return self;
60: };
61:
62: module.exports = ApplicationTabGroup;
?搞得我什么插仉安装不了 :(