使用Eclipse開發Android相關設定問題!

2018年Android開發平台已經由Google自家的Android Studio為主,其他IDE如Eclipse跟NetBeans很難找到資源,這裡記錄這兩週在建置Eclipse FOR Android時遇到的點點滴滴。

首先是Android SDK開發套件,官方已不容易找到載點。

不容易找到載點

複習如何建立Eclipse for Android開發環境:

https://www.jianshu.com/p/c0c2f8a46cb0

SDK遇到閃退,解決連結:

http://yu0410aries.blogspot.tw/2013/06/sdk-manager.html

https://hk.saowen.com/a/26bf2c7dc7a0c320ea138042c8590ad40d6a4ffd12f115c039eb1afc55e61d5e

https://blog.csdn.net/fl1623863129/article/details/72199816

https://blog.csdn.net/xzlAwin/article/details/45959183

http://blog.xuite.net/free6d1823/blog/76401242-Eclipse+%E8%A3%9D%E5%AE%8C+ADT,+Window+%E5%BA%95%E4%B8%8B%E7%9C%8B%E4%B8%8D%E5%88%B0+Android+SDK+Manager

複習如何安裝SDK:

https://www.androidcentral.com/installing-android-sdk-windows-mac-and-linux-tutorial

http://www.tshopping.com.tw/thread-250607-1-1.html

http://learnexp.tw/%E3%80%90android%E3%80%91%E6%A8%A1%E6%93%AC%E5%99%A8eclipse%E5%AE%89%E8%A3%9D%E6%95%99%E5%AD%B8%E6%96%B0-%E5%BE%9E0%E5%88%B01/

http://www.laird.tw/2016/11/eclipse-android-with-os-x.html

SDK在Win10內的變數設定Path:

https://jingyan.baidu.com/article/15622f2434bc5cfdfcbea51c.html

Android SDK manager結構:

https://blog.csdn.net/u011026779/article/details/53178602

eclipse中graphical layout不顯示手機預覽窗口的問題解決方法(嘗試失敗未解決):

https://read01.com/zh-tw/PMdMzg.html#.WrrwPYhuaUl

https://ifun01.com/V9GPFOY.html

https://blog.csdn.net/myapplication/article/details/47128487

原文網址:https://read01.com/PMdMzg.html

關鍵解決方法:

發現了以元素’d:skin’ 開頭的無效內容。此處不應含有子元素。

http://mydebug.blogspot.tw/2016/01/httpwww.html

https://cnbin.github.io/blog/2016/06/12/da-kai-eclipsebao-cuo-:fa-xian-liao-yi-yuan-su-d-skin-kai-tou-de-wu-xiao-nei-rong-.-ci-chu-bu-ying-han-you-zi-yuan-su/

方法1: 在SDK Manager里删除Android-wear相关的image

方法2: 进入sdk目录下,把

..\android-sdk\system-images\android-22\android-wear\armeabi-v7a\devices.xml和..\android-sdk\system-images\android-22\android-wear\x86\devices.xml文件删除,再把sdk里面..\android-sdk\tools\lib\下的devices.xml拷贝到上述两个文件夹里,重启eclipse即可

adb server is out of date 啟動失敗:

https://blog.csdn.net/liranke/article/details/42524851

解决Android library project cannot be launched

https://blog.csdn.net/welovesunflower/article/details/7990952

解決Unable to build: the file dx.jar was not loaded from the SDK folder

https://blog.csdn.net/qq_32224139/article/details/69525946

https://stackoverflow.com/questions/43009679/unknown-error-unable-to-build-the-file-dx-jar-was-not-loaded-from-the-sdk-fold/43040723

對岸的問題小彙整:

https://blog.csdn.net/androiddevelop/article/details/8130416

https://www.jianshu.com/p/1cc1d2df7f95

Android ADT整合包下載(老舊版本啟動失敗):

http://forum.jeasy.info/viewtopic.php?f=61&t=1521

Eclipse自帶jre檔方法:

http://joerong666.iteye.com/blog/309911

關鍵:

在eclipse.c中,有查找shipped VM的代码,eclipse.exe会先查找有没有自带的JVM,有的话就用它启动:
  /* Find the Directory where the Eclipse program is installed. */
  programDir = getProgramDir();
  …
  
  /* If the user did not specify a VM to be used */
  if (vmName == NULL)
  {
  /* Determine which type of VM should be used. */
  vmName = ((debug needConsole) ? consoleVM : defaultVM);
  
  /* Try to find the VM shipped with eclipse. */
  shippedVM = malloc( (_tcslen( programDir ) + _tcslen( shippedVMDir ) + _tcslen( vmName ) + 10) * sizeof(_TCHAR) );
  _stprintf( shippedVM, _T_ECLIPSE(“%s%s%s”), programDir, shippedVMDir, vmName );
  JavaVM = findCommand( shippedVM );
  
  /* Format a message to indicate the default VM search path. */
  vmSearchPath = malloc( (_tcslen( pathMsg ) + _tcslen( shippedVM ) + _tcslen( vmName ) + 10) * sizeof(_TCHAR) );
  _stprintf( vmSearchPath, pathMsg, shippedVM, vmName );
  free( shippedVM );
  shippedVM = NULL;
  }
  
  eclipseWin.h
  _TCHAR* consoleVM   = _T(“java.exe”);
  _TCHAR* defaultVM   = _T(“javaw.exe”);
  _TCHAR* shippedVMDir = _T(“jre\\bin\\”);
  
  这样就可以通过自带JRE解决客户端库不完全的问题

舊版Java官方載點,需申請Oracle帳密:

http://www.oracle.com/technetwork/java/javase/archive-139210.html

Eclipse 自帶jre啟動運行測試

Eclipse 2016,2017,2018+自留存java 8皆成功啟動並可輸出apk於手機運行

自留存java7,9,10皆無法正常運作(找不到jre檔案)

交叉比對,java 7 x64版jre搭配2018版Eclipse啟動成功!

交叉比對,java 9 x64版jre搭配2018版Eclipse啟動成功!

交叉比對,java 10 x64版jre搭配2018版Eclipse啟動….無法重新安裝(系統玩壞了)….暫時擱置測試,待新版java或有空再測試。

Eclipse 2018+安裝java 10皆成功啟動並可輸出apk於手機運行

目前決定開發環境-沿用2018年版Eclipse+Java8+Android+Gluon(測試中)

Eclipse 2018+系統安裝java啟動運行測試

皆可正常運作,不分java版本

版權聲明:網路搜尋連結,供建立環境快速查找使用,因無個論壇帳號,故留存連結,如原作者有疑義,請mail給我將連結移除mail:gerry.aaa@yahoo.com.tw

JavaFX TableView自訂義排序

package funcion;

import java.util.Comparator;

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;

/**200921-GDK-tableview自訂義排序範例-數字格式化排序*/
public class TableViewCostumerSort extends Application {

private TableView table = new TableView();
private ExtraPerson extraPerson = new ExtraPerson(“Ninja Village”);

private final ObservableList data = FXCollections
.observableArrayList(
new Person(“Jacob”, “1,111”, “jacob.smith@example.com”),
new Person(“Isabella”, “1,123”,
“isabella.johnson@example.com”),
new Person(“Ethan”, “111”,
“ethan.williams@example.com”),
new Person(“Emma”, “222,222”, “emma.jones@example.com”),
new Person(“Michael”, “312”, “michael.brown@example.com”),
extraPerson);

public static void main(String[] args) {
launch(args);
}

@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle(“Table View Sample”);
stage.setWidth(450);
stage.setHeight(500);

final Label label = new Label(“Address Book”);
label.setFont(new Font(“Arial”, 20));

table.setEditable(true);

TableColumn firstNameCol = new TableColumn(“First Name”);
firstNameCol.setMinWidth(100);
firstNameCol
.setCellValueFactory(new PropertyValueFactory(
“firstName”));

TableColumn moneyCol = new TableColumn(“Money”);
moneyCol.setMinWidth(100);
moneyCol
.setCellValueFactory(new PropertyValueFactory(
“Money”));

TableColumn emailCol = new TableColumn(“Email”);
emailCol.setMinWidth(200);
emailCol.setCellValueFactory(new PropertyValueFactory(
“email”));

/**
* Adding comparator to extraPerson
* 覆寫sort判斷
*/

table.sortPolicyProperty().set(
new Callback<TableView, Boolean>() {

/*自動生成*/
@Override
public Boolean call(TableView param) {
Comparator comparator = new Comparator() {
@Override
public int compare(Person r1, Person r2) {

/*資料形式轉換*/
double r1_d = 0.0;
double r2_d = 0.0;
if (param.getComparator() != null) {
r1_d = Double.parseDouble(r1.getMoney().replaceAll(“,”, “”).trim());
r2_d = Double.parseDouble(r2.getMoney().replaceAll(“,”, “”).trim());
}

/*資料空值try-catch*/
String col_s = “”;
String _sort_s = “”;

try {
col_s = param.getSortOrder().get(0).getText();
_sort_s = param.getSortOrder().get(0).getSortType().toString();
} catch (java.lang.IndexOutOfBoundsException e) {
System.out.println(e);
}

/*設定選取Money欄位時動作*/
if (col_s.equals(“Money”) && !col_s.equals(“”)) {
if (_sort_s.equals(“ASCENDING”)) {
if (r1_d > r2_d) {
/* 0&-1是不排序1是排序 */
return 1;
} else if (r1_d < r2_d) {
/* 0&-1是不排序1是排序 */
return -1;
} else if (param.getComparator() == null) {
/* 0&-1是不排序1是排序 */
return 0;
} else {
/*預設判斷*/
return param.getComparator().compare(r1, r2);
}
} else if (_sort_s.equals("DESCENDING")) {
if (r1_d r2_d) {
/* 0&-1是不排序1是排序 */
return -1;
} else if (param.getComparator() == null) {
/* 0&-1是不排序1是排序 */
return 0;
} else {
/*預設判斷*/
return param.getComparator().compare(r1, r2);
}
} else {
/*預設判斷*/
return param.getComparator().compare(r1, r2);
}
} else {
try {
/*預設判斷*/
return param.getComparator().compare(r1, r2);
} catch (java.lang.NullPointerException e) {
/*排序*/
System.out.println(e);
return 0;
}
}

}
};

/*預設複寫狀態成立*/
FXCollections.sort(table.getItems(), comparator);
return true;
}
});

table.setItems(data);
table.getColumns().addAll(firstNameCol, moneyCol, emailCol);
// table.getColumns().hashCode();
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table);

((Group) scene.getRoot()).getChildren().addAll(vbox);

stage.setScene(scene);
stage.show();
}

public static class Person {

private final SimpleStringProperty firstName;
private final SimpleStringProperty money;
private final SimpleStringProperty email;

private Person(String fName, String money, String email) {
this.firstName = new SimpleStringProperty(fName);
this.money = new SimpleStringProperty(money);
this.email = new SimpleStringProperty(email);
}

public String getFirstName() {
return firstName.get();
}

public void setFirstName(String fName) {
firstName.set(fName);
}

public String getMoney() {
return money.get();
}

public void setMoney(String Money) {
money.set(Money);
}

public String getEmail() {
return email.get();
}

public void setEmail(String Email) {
email.set(Email);
}
}

public static class ExtraPerson extends Person {

private final SimpleStringProperty address;

private ExtraPerson(String address) {
super(“Itachi”, “333”, “leaf@village.ninja”);
this.address = new SimpleStringProperty(address);
}

public String getAddress() {
return address.get();
}

public void setAddress(String address) {
this.address.set(address);
}

}
}

JavaFX TableView自訂義排序-最後一列資料不納入排序判斷

package funcion;

import java.util.Comparator;

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;

/**200921-GDK-tableview自訂義排序範例-數字格式化排序*/
public class TableViewLastColumNotSort extends Application {

private TableView<Person> table = new TableView<Person>();
private ExtraPerson extraPerson = new ExtraPerson(“Ninja Village”);

private final ObservableList<Person> data = FXCollections
.observableArrayList(
new Person(“Jacob”, “1,111”, “jacob.smith@example.com”),
new Person(“Isabella”, “1,123”,
“isabella.johnson@example.com”),
new Person(“Ethan”, “111”,
“ethan.williams@example.com”),
new Person(“Emma”, “222,222”, “emma.jones@example.com”),
new Person(“Michael”, “312”, “michael.brown@example.com”),
extraPerson);

public static void main(String[] args) {
launch(args);
}

@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group());
stage.setTitle(“Table View Sample”);
stage.setWidth(450);
stage.setHeight(500);

final Label label = new Label(“Address Book”);
label.setFont(new Font(“Arial”, 20));

table.setEditable(true);

TableColumn firstNameCol = new TableColumn(“First Name”);
firstNameCol.setMinWidth(100);
firstNameCol
.setCellValueFactory(new PropertyValueFactory<Person, String>(
“firstName”));

TableColumn moneyCol = new TableColumn(“Money”);
moneyCol.setMinWidth(100);
moneyCol
.setCellValueFactory(new PropertyValueFactory<Person, String>(
“Money”));

TableColumn emailCol = new TableColumn(“Email”);
emailCol.setMinWidth(200);
emailCol.setCellValueFactory(new PropertyValueFactory<Person, String>(
“email”));

/**
* Adding comparator to extraPerson
* 覆寫sort判斷
*/

table.sortPolicyProperty().set(
new Callback<TableView<Person>, Boolean>() {

/*自動生成*/
@Override
public Boolean call(TableView<Person> param) {
Comparator<Person> comparator = new Comparator<Person>() {
@Override
public int compare(Person r1, Person r2) {

if (r1 == table.getItems().get(table.getItems().size()-1)) {
/* r1是最後一筆時正常派排序 */
return 1;
} else if (r2 == table.getItems().get(table.getItems().size()-1)) {
/* r2是最後一筆時不排序 */
return -1;
} else if (param.getComparator() == null) {
return 0;
} else {
return param.getComparator().compare(r1, r2);
}

}
};

/*預設複寫狀態成立*/
FXCollections.sort(table.getItems(), comparator);
return true;
}
});

table.setItems(data);
table.getColumns().addAll(firstNameCol, moneyCol, emailCol);
// table.getColumns().hashCode();
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10, 0, 0, 10));
vbox.getChildren().addAll(label, table);

((Group) scene.getRoot()).getChildren().addAll(vbox);

stage.setScene(scene);
stage.show();
}

public static class Person {

private final SimpleStringProperty firstName;
private final SimpleStringProperty money;
private final SimpleStringProperty email;

private Person(String fName, String money, String email) {
this.firstName = new SimpleStringProperty(fName);
this.money = new SimpleStringProperty(money);
this.email = new SimpleStringProperty(email);
}

public String getFirstName() {
return firstName.get();
}

public void setFirstName(String fName) {
firstName.set(fName);
}

public String getMoney() {
return money.get();
}

public void setMoney(String Money) {
money.set(Money);
}

public String getEmail() {
return email.get();
}

public void setEmail(String Email) {
email.set(Email);
}
}

public static class ExtraPerson extends Person {

private final SimpleStringProperty address;

private ExtraPerson(String address) {
super(“Itachi”, “333”, “leaf@village.ninja”);
this.address = new SimpleStringProperty(address);
}

public String getAddress() {
return address.get();
}

public void setAddress(String address) {
this.address.set(address);
}

}
}

外網連接路由器分配虛擬IP的FTP

大家好,這次要來分享外網連接路由器底下的FTP站台

在之前的文章中與大家分享了如何使用Windows系統來架設FTP站台,今天要來分享如何使用外網連接到自己架設的FTP站台

使用的環境是,windows 10 & ASUS RT-AC2400無線路由器

1.進入無線路由器的設定頁面

如果不知道該怎麼進入可以去cmd輸入ipconfig,假設該裝置的ip是192.168.1.11,那麼路由器的ip就是192.168.1.1

2.找到進階設定=>外部網路

3.點選”虛擬伺服器”,點選”開啟虛擬伺服器-ON”,點選”新增設定檔”

4.找到自訂設定=>服務名稱,點選”FTP Server”

5.找到自訂設定=>通訊協定,點選”BOTH”

6.此時外部通訊埠與內部通訊埠應該都自動設定好了

7.找到自訂設定=>本地IP位置,輸入該裝置的ip

8.完成

參考來源:ASUS官網

備份資料庫的小技巧

大家好,這次要來分享一個備份資料庫的小技巧

相信使用mysqldump來備份資料庫的使用者,很多人會使用當天的日期及時間來當檔名,這樣對於資料管理是有幫助的。

但是也會常遇到一個問題,假設備份資料庫的時間是AM09:30,系統判斷無法9前面的空白字元,這樣一來備份就會出問題。

這裡要來分享一個小技巧來解決這種冏況。

下面的方法是建立一個.bat檔來執行備份資料庫

1.新增一個bat檔==>編輯

2.編輯內容

echo off

echo %date%

echo %time%

set hour=%time: =0%
c:\AAA\mysqldump.exe -BBB -hCCC -pDDD EEE > c:\FFF\%date:~0,4%%date:~5,2%%date:~8,2%%hour:~0,2%%time:~3,2%%time~5,2%.sql

3.

AAA==>mysqldump的路徑
BBB==>username
CCC==>IP
DDD==>password
EEE==>資料庫名稱
FFF==>備份檔位置

參考來源:https://www.jb51.net/article/195100.htm

iPhone備份照片小技巧

大家好,這次要來分享一個iPhone備份照片到電腦的小技巧

使用的環境是,iOS 13及更新的版本,Windows 10

若,本機端的IP不是使用由ISP業者提供的固定IP,要先設定手機及本機端是在同一個網域

1.先在電腦端新增一個資料夾

2.右鍵=>內容=>共用=>共用=>下拉式選單選擇”Everyone”=>新增=>權限=>選擇”讀取/寫入”=>共用

3.控制台=>網路和網際網路=>網路和共用中心=>進階共用設定=>私人(目前設定檔)=>打開選項”開啟網路探索”及”開啟檔案及列表機共用”

4.控制台=>網路和網際網路=>網路和共用中心=>進階共用設定=>所有網路=>打開選項”開啟共用,只讓具有網路存取權的人員讀取和寫入公用資料夾中的檔案”及”關閉以密碼保護的共用”

5.找本機端的IP

6.點選iPhone”檔案”=>右上角一個圈圈裏面有三個點點=>連接伺服器=>輸入本機端的IP=>點選”訪客”

7.點選iPhone”照片”=>選擇要傳輸的照片=>點選左下角分享=>儲存到檔案=>點選剛連線的IP=>選擇剛設定的資料夾=>右上角儲存

8.完成

參考來源:https://www.kocpc.com.tw/archives/372935

使用BAT檔備份資料庫

大家好,這次要來分享如何使用BAT檔來進行資料庫的備份

使用的環境是,windows 10 & mysql資料庫

開始之前請先準備好mysqldump.exe這個檔案,如果使用的XAMPP這個軟體的話,可以去xampp\mysql\bin的資料夾底下去找

1.新增一個.bat檔

2.右鍵=>編輯

3.C:\mysqldump -u AAAAA -h 192.168.0.0 -pBBBBB XXXXX > D:\%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%.sql

C:\mysqldump<==這裡要輸入mysqldump.exe這個檔案的路徑

AAAAA<==這裡要輸入資料庫的username,本機端可以輸入root

192.168.0.0<==這裡要輸入ip,本機端輸入localhost or 127.0.0.1

BBBBB<==如果user有設密碼,在這輸入密碼,-p跟密碼之間不要有空格

D:\<==這裡輸入備份檔要儲存的路徑

%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%<==這裡可以輸入檔名,這裡使用的是使用日期及時間來當成檔名

用下面的案例來解釋,在cmt底下輸入date會出現==>現在日期是: 2134/07/29 週一

%date:~0,4%=>2134,在2134/07/29這一列資料從第0的位置擷取4個位置的資料

%date:~5,2%=>07,在2134/07/29這一列資料從第5的位置擷取2個位置的資料

%date:~8,2%=>29,在2134/07/29這一列資料從第8的位置擷取2個位置的資料

ps.2134/07/29,2這一欄的資料位置是第0個

參考來源:https://blog.miniasp.com/post/2009/11/03/How-to-get-system-date-time-in-batch-file-part-III

Windows FTP淺介

大家好,這次要來分享如何設定windows系統的FTP功能

使用的環境是,windows 10

1.在電腦新增一個資料夾

2.控制台=>程式與功能=>開啟或關閉windows功能

3.Internet Information Services=>FTP 伺服器=>將FTP 服務 及FTP 擴充性 都打開

4.Internet Information Services=>Web管理工具=>將IIS主控台打開

5.控制台=>系統管理工具=>打開Internet Information Services(IIS)管理員

6.左側欄位=>右鍵=>新增FTP站台

7.輸入想要設定的FTP站台名稱,實體路徑點選剛才新增的資料夾

8.IP位置輸入自己的IP,點選”沒有SSL(L)”欄位

9.點選”基本”,點選”指定的使用者”,下面的欄位輸入本機帳戶,點選”讀取”及”寫入”

10.控制台=>Windows Defender防火牆=>允許應用程式或功能通過Windows Defender防火牆=>變更設定=>將FTP伺服器”私人”及”公用”打開

11.開始=>設定=>帳戶=>家人與其他使用者=>將其他人新增至此電腦=>我沒有這位人員的登入資訊=>新增沒有Microsoft帳戶的使用者=>輸入相關資訊

12.Internet Information Services(IIS)管理員=>點選剛才新增的FTP站台=>FTP授權規則=>新增允許規則=>指定的使用者=>輸入剛才新增的使用者=>打開”讀取”及”寫入”

13.我的電腦=>實體路徑的資料夾=>右鍵.內容=>安全性=>編輯=>新增(D)=>輸入物件名稱來選取=>輸入剛才新增的使用者=>檢查名稱=>確定=>回到資料夾內容將剛才新增的使用者的權限.完全控制.允許

14.可用檔案總管的網址列或是瀏覽器的網址列輸入ftp://+IP,輸入帳號及密碼就可以開始使用了

參考來源:https://www.youtube.com/watch?v=ke3tnd73aUI

1 2 3 4 5