java跨平台项目-lisa
鑒于halloya沒有功能,我打算啟動一個新項目,其功能大致設想如下:
- 這是一個to do list,記錄所要完成的事情。
- 可以跨平臺運行,包括我的windows PC和塞班手機,不需要適應性開發。充分利用java的一次編譯,到處運行的特點。
- 可以用語音快速錄入,直接記錄語音信息。
- 支持五條以上,十條左右為佳。
- 多平臺信息同步。
- 事情完成后,任務信息從to do list自動轉入done list,而不是刪除或是留在原to do list中。兩個清晰分開互不干擾。
鑒于我現在對安卓的應用最熟悉,先開發安卓版本,然后開發通用的java版本,最后用C++開發windows版本。
同步問題:以手機為主,PC為輔,以藍牙或者是互聯網的形式進行同步。
2014.2.28
首頁僅顯示五個有內容條目和一個空條目,排名靠后的條目在新增條目后會被擠到第二頁。第二頁不可編輯,無限條目。第二次打開后,空條目再次出現,不用點擊按鈕新增條目,直接在空條目中編寫即可。
2014.2.28
打算在已有的lisa軟件基礎上增加一個功能,當手機和電腦同處一個無線局域網即共用同一個wifi時,點擊lisa界面上的同步按鈕,手機通過局域網路由將本地記錄傳送至電腦,從而完成同步。再同步過程中,無需制定收發文件夾,直接在程序中設置好默認的收發文件夾路徑。爭取做到“一擊完成”。
2014.2.27
在textview中顯示當前時間,參考Android中當前時間的動態顯示和SimpleDateFormat使用詳解以及Java中的DateFormat用法舉例
2014.2.24
[2014-02-24 20:25:25 - Lisa] ------------------------------
[2014-02-24 20:25:25 - Lisa] Android Launch!
[2014-02-24 20:25:25 - Lisa] adb is running normally.
[2014-02-24 20:25:26 - Lisa] Could not find Lisa.apk!
以上故障原因是在創建工程過程中,選擇了把本項目作為library的原因。
確定光標出現位置,要光標出現在哪個View內,就把以下的紅色代碼<requestFocus />加入該控件對應的元素中
? ? <EditText
? ? ? ? android:id="@+id/editText1"
? ? ? ? android:layout_width="wrap_content"
? ? ? ? android:layout_height="wrap_content"
? ? ? ? android:layout_alignParentLeft="true"
? ? ? ? android:layout_alignParentRight="true"
? ? ? ? android:layout_alignParentTop="true"
? ? ? ? android:ems="10"
? ? ? ? android:inputType="text" >
? ? ? ? <requestFocus />
? ? </EditText>
將edittext改為多行顯示,也就是能夠自動換行,把以上代碼中的inputType由text改為"textMultiLine"。
以上更改完成后,截圖如下
另外,可以將String path = "/mnt/sdcard/lisa/"改為
String path =Environment.getExternalStorageDirectory()+ "/lisa/",lisa前面一定要加/,不然路徑無效,當然lisa后面也一定要加/。
其中Environment.getExternalStorageDirectory()==?"/mnt/sdcard/",不過還要記得import android.os.Environment;不然就會報錯
工程文件壓縮包下載
主要程序
2014.2.23
ViewPager的設計上遇到了困難,暫時放下,先實現軟件基本功能再說。
利用先前的AndroidFile的成功項目,對其進行擴張,擴大記事條目數量,就能實現Lisa最基本的功能——記錄所要完成的事情。
2014.2.13
目前遇到的問題是app打不開,如圖
經模塊測試,問題出在viewpager上,todolist.xml作為viewpager起始頁后,需要在文件中增加如下代碼
? ? <android.support.v4.view.ViewPager
? ? ? ? android:id="@+id/todolist"
? ? ? ? android:layout_width="match_parent"
? ? ? ? android:layout_height="match_parent" />
而且android:id="@+id/todolist"這一行不能在ndroid.support.v4.view.ViewPager元素之外,就是必須在ViewPager元素內設置ViewPager的id。
目前還存在如下問題,在滑動viewpager時,起始頁不消失,發生重影,如下圖
2014.2.12
2014.2.8
受win8的啟發,打算模仿win8的磁貼,在手機首頁添加一個 長方區域,區域內會滾動顯示要完成的事,就像win8的照片磁貼一樣。
2014.1.25
一直覺得如果安卓桌面上的widget就是布局文件里的button、textview之類的,但是并不是每個app的widget都能在widget目錄里找到,原來桌面上的widget并不屬于widget庫,而是單獨屬于appwidget庫,
android官網對app widgets的定義
andoid.appwidget庫的說明書
ADT SDK中提供的相關例子的項目名是WidgetPreview
可參考文獻
2014.1.11
項目名更名為Lisa,取個人命,更親切。
Lisa 1.0功能簡介:
- 軟件名稱叫Lisa,Lisa是一個秘書,能夠幫你記錄你想要完成的事情。
- Lisa會把這些事情記錄到你的電腦中。在Where to locate your notes下方輸入這些記錄的存放地址。然后點擊ok。Lisa會自動記憶住這個地址,下次打開Lisa時會自動顯示這個地址存放的記錄。
- 在ok下方的記事板上可以記錄五個你想做的事情,可以隨時打開編輯這五個記錄,點擊save就能立刻保存。
import java.awt.Color; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField;public class JlisaPC extends JFrame implements ActionListener{/***Java PC Lisa 1.0 */private static final long serialVersionUID = 1L;JLabel Notification;static JTextField Location,Task_1,Task_2,Task_3,Task_4,Task_5;JButton save,OK;static File m1,m2,m3,m4,m5=null;static String log="C:\\Lisa\\",path=null;//frame definitionJlisaPC() {super("Hey, I'm Lisa");setSize(400,700);setBackground(Color.blue);Notification=new JLabel("Where to locate your noetes?");Location=new JTextField();Task_1= new JTextField(); Task_2= new JTextField(); Task_3= new JTextField(); Task_4= new JTextField(); Task_5= new JTextField(); save=new JButton("save");save.setBackground(Color.magenta);save.setActionCommand("save");save.addActionListener(this);OK=new JButton("OK");OK.setBackground(Color.BLUE);OK.setActionCommand("OK");OK.addActionListener(this);setLayout(new GridLayout(9,1));add(Notification);add(Location);add(OK);add(Task_1) ; add(Task_2) ; add(Task_3) ;add(Task_4) ;add(Task_5) ;add(save);}//about button actionpublic void actionPerformed(ActionEvent c) {//about button -OK-DataInputStream in1,in2,in3,in4,in5;DataOutputStream out;if (c.getActionCommand().equals("OK")){try {out=new DataOutputStream(new FileOutputStream(log+"m.txt"));out.writeUTF(Location.getText());out.close(); } catch (FileNotFoundException e1) {e1.printStackTrace();} catch (IOException e) {e.printStackTrace();}path=Location.getText()+"\\lisa\\";try {File lisa=new File(path);if(!lisa.exists()){lisa.mkdir();}else{in1=new DataInputStream(new FileInputStream(path+"m1.txt"));in2=new DataInputStream(new FileInputStream(path+"m2.txt"));in3=new DataInputStream(new FileInputStream(path+"m3.txt"));in4=new DataInputStream(new FileInputStream(path+"m4.txt"));in5=new DataInputStream(new FileInputStream(path+"m5.txt"));Task_1.setText(in1.readUTF());Task_2.setText(in2.readUTF());Task_3.setText(in3.readUTF());Task_4.setText(in4.readUTF());Task_5.setText(in5.readUTF());in1.close();in2.close();in3.close();in4.close();in5.close();}} catch (IOException e) {e.printStackTrace();}}//about button "save"DataOutputStream out1,out2,out3,out4,out5;if (c.getActionCommand().equals("save")){String s1=Task_1.getText();String s2=Task_2.getText();String s3=Task_3.getText();String s4=Task_4.getText();String s5=Task_5.getText();try{m1=new File(path+"m1.txt");if(!m1.exists())//判斷文件是否存在m1.createNewFile();//創建文件else if(s1.length()!=0){m1.delete();m1.createNewFile();}out1=new DataOutputStream(new FileOutputStream(path+"m1.txt"));out1.writeUTF(s1);out1.close();m2=new File(path+"m2.txt");if(!m2.exists())//判斷文件是否存在m2.createNewFile();//創建文件else if(s2.length()!=0){m2.delete();m2.createNewFile();}//如果存在輸入重新建立文件out2=new DataOutputStream(new FileOutputStream(path+"m2.txt"));out2.writeUTF(s2);out2.close();m3=new File(path+"m3.txt");if(!m3.exists())//判斷文件是否存在m3.createNewFile();//創建文件else if(s3.length()!=0){m3.delete();m3.createNewFile();}out3=new DataOutputStream(new FileOutputStream(path+"m3.txt"));out3.writeUTF(s3);out3.close();m4=new File(path+"m4.txt");if(!m4.exists())//判斷文件是否存在m4.createNewFile();//創建文件else if(s4.length()!=0){m4.delete();m4.createNewFile();}out4=new DataOutputStream(new FileOutputStream(path+"m4.txt"));out4.writeUTF(s4);out4.close();m5=new File(path+"m5.txt");if(!m5.exists())//判斷文件是否存在m5.createNewFile();//創建文件else if(s5.length()!=0){m5.delete();m5.createNewFile();}out5=new DataOutputStream(new FileOutputStream(path+"m5.txt"));out5.writeUTF(s5);out5.close();}catch (IOException ex){ex.printStackTrace();}}}//main functionpublic static void main(String[] args){JFrame frame = new JlisaPC();// 創建JFrame對象,初始不可見frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 設置框架關閉按鈕事件frame.setVisible(true); // 顯示框架主窗口DataInputStream in;File Lisa=new File(log);File m=new File(log+"m.txt");try {if(!Lisa.exists()){//判斷文件是否存在Lisa.mkdir();//create folderm.createNewFile();//Create file} else{in=new DataInputStream(new FileInputStream(log+"m.txt"));Location.setText(in.readUTF());in.close();}}catch (IOException e) {e.printStackTrace();} } }
2014.1.4
成功的將手機版Jlist移植到PC上,解決了很多問題,耗費了半天時間,解決bug還是先做小量代碼試驗比較奏效,遠比在網上瘋狂搜索要有效得多。下一步是增加一個對話框,可以修改記憶文件的地址。這樣,不同的電腦都可以使用,而不必專門修改代碼。
可執行文件及源代碼文件的下載地址:點擊打開鏈接
import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import javax.swing.*;public class Jlist extends JFrame implements ActionListener{static JTextField Task_1,Task_2,Task_3,Task_4,Task_5;JTextArea Summary;JButton save;static File m1,m2,m3,m4,m5=null;static String path="C:\\Users\\umiz\\Documents\\我的微盤\\Jlist\\";Jlist() {//super("J-list");setSize(400,700);setBackground(Color.blue);Task_1= new JTextField(); Task_2= new JTextField(); Task_3= new JTextField(); Task_4= new JTextField(); Task_5= new JTextField(); Summary=new JTextArea();Summary.setEditable(false);save=new JButton("save");save.setBackground(Color.magenta);save.setActionCommand("save");save.addActionListener(this);setLayout(new GridLayout(7,1));add(Task_1) ; add(Task_2) ; add(Task_3) ;add(Task_4) ;add(Task_5) ;add(Summary);add(save);}public void actionPerformed(ActionEvent c) {// TODO Auto-generated method stubDataOutputStream out1,out2,out3,out4,out5;if (c.getActionCommand().equals("save")){String s1=Task_1.getText();String s2=Task_2.getText();String s3=Task_3.getText();String s4=Task_4.getText();String s5=Task_5.getText();try{m1=new File(path+"m1.txt");if(!m1.exists())//判斷文件是否存在m1.createNewFile();//創建文件else if(s1.length()!=0){m1.delete();m1.createNewFile();}out1=new DataOutputStream(new FileOutputStream(path+"m1.txt"));out1.writeUTF(s1);out1.close();m2=new File(path+"m2.txt");if(!m2.exists())//判斷文件是否存在m2.createNewFile();//創建文件else if(s2.length()!=0){m2.delete();m2.createNewFile();}//如果存在輸入重新建立文件out2=new DataOutputStream(new FileOutputStream(path+"m2.txt"));out2.writeUTF(s2);out2.close();m3=new File(path+"m3.txt");if(!m3.exists())//判斷文件是否存在m3.createNewFile();//創建文件else if(s3.length()!=0){m3.delete();m3.createNewFile();}out3=new DataOutputStream(new FileOutputStream(path+"m3.txt"));out3.writeUTF(s3);out3.close();m4=new File(path+"m4.txt");if(!m4.exists())//判斷文件是否存在m4.createNewFile();//創建文件else if(s4.length()!=0){m4.delete();m4.createNewFile();}out4=new DataOutputStream(new FileOutputStream(path+"m4.txt"));out4.writeUTF(s4);out4.close();m5=new File(path+"m5.txt");if(!m5.exists())//判斷文件是否存在m5.createNewFile();//創建文件else if(s5.length()!=0){m5.delete();m5.createNewFile();}out5=new DataOutputStream(new FileOutputStream(path+"m5.txt"));out5.writeUTF(s5);out5.close();Summary.setText("1. "+s1+"\n"+"2. "+s2+"\n"+"3. "+s3+"\n"+"4. "+s4+"\n"+"5. "+s5+"\n");}catch (IOException ex){ex.printStackTrace();}}}public static void main(String args[]){// 主方法JFrame frame = new Jlist();// 創建JFrame對象,初始不可見DataInputStream in1,in2,in3,in4,in5;try {File m=new File(path);m.delete();if(!m.exists()){m.mkdir();}else{in1=new DataInputStream(new FileInputStream(path+"m1.txt"));in2=new DataInputStream(new FileInputStream(path+"m2.txt"));in3=new DataInputStream(new FileInputStream(path+"m3.txt"));in4=new DataInputStream(new FileInputStream(path+"m4.txt"));in5=new DataInputStream(new FileInputStream(path+"m5.txt"));Task_1.setText(in1.readUTF());Task_2.setText(in2.readUTF());Task_3.setText(in3.readUTF());Task_4.setText(in4.readUTF());Task_5.setText(in5.readUTF());in1.close();in2.close();in3.close();in4.close();in5.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 設置框架關閉按鈕事件frame.setVisible(true); // 顯示框架主窗口} }
2014.1.2
Jlist出了新版本,
import java.io.*;import javax.microedition.io.*; import javax.microedition.io.file.FileConnection; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; import javax.microedition.lcdui.*;public class Jlist extends MIDlet implements CommandListener {Form f = new Form("J-List") ; TextField Task_1,Task_2,Task_3,Task_4,Task_5,Summary; Command exitCommand=new Command("Exit", Command.EXIT, 0);Command saveCommand=new Command("Save", Command.OK, 0);FileConnection m1,m2,m3,m4,m5=null;DataOutputStream out1,out2,out3,out4,out5;DataInputStream in1,in2,in3,in4,in5;String path="file://localhost/E:/Jlist/";public Jlist() {// Task_1= new TextField("Task 1","",100,TextField.ANY) ; Task_2= new TextField("Task 2","",100,TextField.ANY) ; Task_3= new TextField("Task 3","",100,TextField.ANY) ; Task_4= new TextField("Task 4","",100,TextField.ANY) ; Task_5= new TextField("Task 5","",100,TextField.ANY) ; Summary=new TextField("Summary","",500,TextField.ANY);f.append("To Do List");f.append(Task_1) ; f.append(Task_2) ; f.append(Task_3) ;f.append(Task_4) ;f.append(Task_5) ;f.append(Summary);Display.getDisplay(this).setCurrent(f);f.addCommand(exitCommand);f.addCommand(saveCommand);f.setCommandListener(this);try {FileConnection m=(FileConnection) Connector.open(path);if(!m.exists()) m.mkdir();else{m1=(FileConnection) Connector.open(path+"m1.txt");m2=(FileConnection) Connector.open(path+"m2.txt");m3=(FileConnection) Connector.open(path+"m3.txt");m4=(FileConnection) Connector.open(path+"m4.txt");m5=(FileConnection) Connector.open(path+"m5.txt");in1=m1.openDataInputStream();in2=m2.openDataInputStream();in3=m3.openDataInputStream();in4=m4.openDataInputStream();in5=m5.openDataInputStream();Task_1.setString(in1.readUTF());Task_2.setString(in2.readUTF());Task_3.setString(in3.readUTF());Task_4.setString(in4.readUTF());Task_5.setString(in5.readUTF());in1.close();in2.close();in3.close();in4.close();in5.close();}} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}protected void destroyApp(boolean arg0) throws MIDletStateChangeException {// TODO Auto-generated method stub}protected void pauseApp() {// TODO Auto-generated method stub}protected void startApp() throws MIDletStateChangeException {// TODO Auto-generated method stub}public void commandAction(Command c, Displayable s) {// TODO Auto-generated method stubif (c.getCommandType() == Command.EXIT)notifyDestroyed();else if (c.getCommandType() == Command.OK){String s1=Task_1.getString();String s2=Task_2.getString();String s3=Task_3.getString();String s4=Task_4.getString();String s5=Task_5.getString();try{m1=(FileConnection) Connector.open(path+"m1.txt");if(!m1.exists())//判斷文件是否存在m1.create();//創建文件else if(s1.length()!=0){m1.delete();m1.create();}out1=m1.openDataOutputStream();out1.writeUTF(s1);out1.close();m2=(FileConnection) Connector.open(path+"m2.txt");if(!m2.exists())//判斷文件是否存在m2.create();//創建文件else if(s2.length()!=0){m2.delete();m2.create();}//如果存在輸入重新建立文件out2=m2.openDataOutputStream();out2.writeUTF(s2);out2.close();m3=(FileConnection) Connector.open(path+"m3.txt");if(!m3.exists())//判斷文件是否存在m3.create();//創建文件else if(s3.length()!=0){m3.delete();m3.create();}out3=m3.openDataOutputStream();out3.writeUTF(s3);out3.close();m4=(FileConnection) Connector.open(path+"m4.txt");if(!m4.exists())//判斷文件是否存在m4.create();//創建文件else if(s4.length()!=0){m4.delete();m4.create();}out4=m4.openDataOutputStream();out4.writeUTF(s4);out4.close();m5=(FileConnection) Connector.open(path+"m5.txt");if(!m5.exists())//判斷文件是否存在m5.create();//創建文件else if(s5.length()!=0){m5.delete();m5.create();}out5=m5.openDataOutputStream();out5.writeUTF(s5);out5.close();in1=m1.openDataInputStream();in2=m2.openDataInputStream();in3=m3.openDataInputStream();in4=m4.openDataInputStream();in5=m5.openDataInputStream();Summary.setString("Task 1:"+in1.readUTF()+"Task 2:"+in2.readUTF()+"Task 3:"+in3.readUTF()+"Task 4:"+in4.readUTF()+"Task 5:"+in5.readUTF());in1.close();in2.close();in3.close();in4.close();in5.close();}catch (IOException ex){ex.printStackTrace();}}} } 關于同步功能的新構想:
2013.12.26
我已經了解到java的一次編譯到處運行是在PC與PC之間,手機與手機之間而言,PC與手機之間是不能互通的。基礎類庫不同,手機上的java軟件并不能在PC的java平臺上運行。這是有限的跨平臺,而不是我所想的那種完全的跨平臺。物聯網中的各個計算機節點的物理硬件差異比PC和手機之間大得多,那么java的這種跨平臺特性是不足夠的。
解決了中文亂碼問題,癥結由文字編碼格式ASCII造成,改為UTF即可,但是保存的文本文檔開頭仍會多顯示一個字節的亂碼。TextField中若無輸入,則保留原來的本文內容,不會改變。主要參考
import java.io.*;import javax.microedition.io.*; import javax.microedition.io.file.FileConnection; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; import javax.microedition.lcdui.*;public class Jlist extends MIDlet implements CommandListener {Form f = new Form("J-List") ; TextField Task_1,Task_2,Task_3,Task_4,Task_5; Command exitCommand=new Command("Exit", Command.EXIT, 0);Command saveCommand=new Command("Save", Command.OK, 0);FileConnection m1,m2,m3,m4,m5=null;DataOutputStream out1,out2,out3,out4,out5;public Jlist() {// Task_1= new TextField("Task 1","",100,TextField.ANY) ; Task_2= new TextField("Task 2","",100,TextField.ANY) ; Task_3= new TextField("Task 3","",100,TextField.ANY) ; Task_4= new TextField("Task 4","",100,TextField.ANY) ; Task_5= new TextField("Task 5","",100,TextField.ANY) ; f.append("To Do List");f.append(Task_1) ; f.append(Task_2) ; f.append(Task_3) ;f.append(Task_4) ;f.append(Task_5) ;Display.getDisplay(this).setCurrent(f);f.addCommand(exitCommand);f.addCommand(saveCommand);f.setCommandListener(this);}protected void destroyApp(boolean arg0) throws MIDletStateChangeException {// TODO Auto-generated method stub}protected void pauseApp() {// TODO Auto-generated method stub}protected void startApp() throws MIDletStateChangeException {// TODO Auto-generated method stub}public void commandAction(Command c, Displayable s) {// TODO Auto-generated method stubif (c.getCommandType() == Command.EXIT)notifyDestroyed();else if (c.getCommandType() == Command.OK){String s1=Task_1.getString();String s2=Task_2.getString();String s3=Task_3.getString();String s4=Task_4.getString();String s5=Task_5.getString();try{m1=(FileConnection) Connector.open("file://localhost/E:/Jlist/m1.txt");if(!m1.exists())//判斷文件是否存在m1.create();//創建文件else if(s1.length()!=0){m1.delete();m1.create();}out1=m1.openDataOutputStream();out1.writeUTF(s1);out1.close();m2=(FileConnection) Connector.open("file://localhost/E:/Jlist/m2.txt");if(!m2.exists())//判斷文件是否存在m2.create();//創建文件else if(s2.length()!=0){m2.delete();m2.create();}//如果存在輸入重新建立文件out2=m2.openDataOutputStream();out2.writeUTF(s2);out2.close();m3=(FileConnection) Connector.open("file://localhost/E:/Jlist/m3.txt");if(!m3.exists())//判斷文件是否存在m3.create();//創建文件else if(s3.length()!=0){m3.delete();m3.create();}out3=m3.openDataOutputStream();out3.writeUTF(s3);out3.close();m4=(FileConnection) Connector.open("file://localhost/E:/Jlist/m4.txt");if(!m4.exists())//判斷文件是否存在m4.create();//創建文件else if(s4.length()!=0){m4.delete();m4.create();}out4=m4.openDataOutputStream();out4.writeUTF(s4);out4.close();m5=(FileConnection) Connector.open("file://localhost/E:/Jlist/m5.txt");if(!m5.exists())//判斷文件是否存在m5.create();//創建文件else if(s5.length()!=0){m5.delete();m5.create();}out5=m5.openDataOutputStream();out5.writeUTF(s5);out5.close();}catch (IOException ex){ex.printStackTrace();}}} }
2013.12.24
主要參考點擊打開鏈接
import java.io.*;import javax.microedition.io.*; import javax.microedition.io.file.FileConnection; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; import javax.microedition.lcdui.*;public class Jlist extends MIDlet implements CommandListener {Form f = new Form("J-List") ; TextField Task_1; TextField Task_2; TextField Task_3; TextField Task_4;TextField Task_5;Command exitCommand=new Command("Exit", Command.EXIT, 0);Command saveCommand=new Command("Save", Command.OK, 0);FileConnection m=null;DataOutputStream out;public Jlist() {// Task_1= new TextField("Task 1","",30,TextField.ANY) ; Task_2= new TextField("Task 2","",30,TextField.ANY) ; Task_3= new TextField("Task 3","",30,TextField.ANY) ; Task_4= new TextField("Task 4","",30,TextField.ANY) ; Task_5= new TextField("Task 5","",30,TextField.ANY) ; f.append("To Do List");f.append(Task_1) ; f.append(Task_2) ; f.append(Task_3) ;f.append(Task_4) ;f.append(Task_5) ;Display.getDisplay(this).setCurrent(f);f.addCommand(exitCommand);f.addCommand(saveCommand);f.setCommandListener(this);}protected void destroyApp(boolean arg0) throws MIDletStateChangeException {// TODO Auto-generated method stub}protected void pauseApp() {// TODO Auto-generated method stub}protected void startApp() throws MIDletStateChangeException {// TODO Auto-generated method stub}public void commandAction(Command c, Displayable s) {// TODO Auto-generated method stubif (c.getCommandType() == Command.EXIT)notifyDestroyed();else if (c.getCommandType() == Command.OK){String s1=Task_1.getString();String s2=Task_2.getString();String s3=Task_3.getString();String s4=Task_4.getString();String s5=Task_5.getString();try{m=(FileConnection) Connector.open("file://localhost/E:/Jlist/m.txt");if(!m.exists())//判斷文件是否存在m.create();//創建文件out=m.openDataOutputStream();out.writeChars(s1);out.writeChars(s2);out.writeChars(s3);out.writeChars(s4);out.writeChars(s5);out.close();}catch (IOException ex){ex.printStackTrace();}}} } 能夠將textfield中的文本保存至手機本地文本文件中,存在的問題是不能保存中文
2013.12.23
java語言里有異常處理的功能,也就是具有幫助程序面對不確定性的能力,try這個關鍵字很有意思,那么人工智能里能不能用上呢,自動駕駛汽車能不能也具備try的能力呢?
下一步,J-list將具有把task textfield中的文本保存到手機中的文本文件中的能力。
2013.12.22
成功在塞班系統里通過應用程序生成文件,有些文件夾是不能創建文件的,例如根目錄和Other文件夾
import java.io.*; import javax.microedition.io.*; import javax.microedition.io.file.FileConnection; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; import javax.microedition.lcdui.*;public class Jlist extends MIDlet implements CommandListener {public Jlist() {// TODO Auto-generated constructor stubFileConnection m=null;try{m=(FileConnection) Connector.open("file://localhost/E:/JM/m.txt");if(!m.exists())//判斷文件是否存在m.create();//創建文OutputStream out = m.openOutputStream();byte[] b="dabomei".getBytes();out.write(b);out.close();}catch (IOException ex){ex.printStackTrace();}Form f = new Form("J-List") ; TextField Task_1; TextField Task_2; TextField Task_3; TextField Task_4;TextField Task_5;Task_1= new TextField("Task 1","",30,TextField.ANY) ; Task_2= new TextField("Task 2","",30,TextField.ANY) ; Task_3= new TextField("Task 3","",30,TextField.ANY) ; Task_4= new TextField("Task 4","",30,TextField.ANY) ; Task_5= new TextField("Task 5","",30,TextField.ANY) ; f.append("To Do List");f.append(Task_1) ; f.append(Task_2) ; f.append(Task_3) ;f.append(Task_4) ;f.append(Task_5) ;Display.getDisplay(this).setCurrent(f);Command exitCommand = new Command("Exit", Command.EXIT, 0);f.addCommand(exitCommand);f.setCommandListener(this);}protected void destroyApp(boolean arg0) throws MIDletStateChangeException {// TODO Auto-generated method stub}protected void pauseApp() {// TODO Auto-generated method stub}protected void startApp() throws MIDletStateChangeException {// TODO Auto-generated method stub}public void commandAction(Command c, Displayable s) {// TODO Auto-generated method stubif (c.getCommandType() == Command.EXIT)notifyDestroyed();}} 參考文獻: 1? 2實際效果:
2013.12.18
今天完成了初步,尚無保存功能,可以編輯。若要實現保存功能,還需import java.io,進行文件操作,將textfield中的文本保存至一個文本文件中。
import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; import javax.microedition.lcdui.*; //import java.io.*;public class todolist extends MIDlet {public todolist() {// TODO Auto-generated constructor stubsuper (); Form f = new Form("To Do List") ; TextField Task_1; TextField Task_2; TextField Task_3; Task_1= new TextField("Task 1","",30,TextField.ANY) ; Task_2= new TextField("Task 2","",30,TextField.ANY) ; Task_3= new TextField("Task 3","",30,TextField.ANY) ; f.append(Task_1) ; f.append(Task_2) ; f.append(Task_3) ; Display.getDisplay(this).setCurrent(f);}protected void destroyApp(boolean arg0) throws MIDletStateChangeException {// TODO Auto-generated method stub}protected void pauseApp() {// TODO Auto-generated method stub}protected void startApp() throws MIDletStateChangeException {// TODO Auto-generated method stub}}效果如下
實際效果如下
2013.12.12
今天成功建立了第一個J2ME項目
導入界面類import javax.microedition.lcdui.*;
在todolist函數中增加程序
super ();?
Form form = new Form("Hello World");?
form.append("Welcome to J2ME World!");?
Display.getDisplay(this).setCurrent(form);?
運行
5530上的運行效果:
2013.12.7
終于又有點進展了,今天把eclipseme裝上了,建立了J2ME環境。參考Eclipse 安裝插件現在我還沒有安卓手機,我也不想馬上換手機。對5530還有點感情,用到明年初吧。沒有測試設備,開發安卓版沒有激情,只好先用諾基亞吧,把java版先弄出來,裝在小5上馬上就看到實際效果啦。
又碰到命令行,命令行的命令我總忘,這里再總結下,cd 文件夾名稱 就是位置跳轉位置,d:就直接跳轉到d盤
2013.11.20
終于有時間重新開啟這個項目了,慢慢走上正軌!
參考案例:
android ListView詳解-博客園
Android ListView常用用法-ITEYE
Android入門第六篇之ListView (一)
2013.10.19
list的實現方法較多,先嘗試ListActivity
目標:在todolist頁制成以原畫面為背景的列表,暫不考慮滑動刪除、排序和編輯功能。
作為測試設備的安卓平板壞了,模擬器速度太慢成為一大問題。發現intel XDK有點意思,HTML5能完成java未實現的愿望嗎?
另,開始學習j2me,貌似可以不裝諾基亞的開發軟件,不用模擬器,用eclipse就行了。測試設備就用我的手機。
2013.10.7
List View概念
ListView官方釋義
需求定義:
- todolist中的item右滑轉移到donelist,donelist中的item左滑回到todolist,右滑刪除。
- todolist中的item可以編輯,donelist不可。
- 在todolist下增加子list--canlist,記錄可以做的事,容易做的事。
- todolist主題色紅色,示緊急;donelist色綠,示通過;canlist色藍,示未來。
- 設置垃圾箱,被誤刪的item可以在垃圾箱里恢復。
2013.10.6
工程代碼已經打包,下載地址
主要的bug在于todolist.xml的格式不對。
在<android.support.v4.view.ViewPager/>中必須指定ViewPager選取的區域大小,這兩行必不可少
android:layout_width="match_parent" android:layout_height="match_parent"
還要指定ViewPager的id和內容
android:id="@+id/todolist"android:background="@drawable/todoback" 以下是布局文件和源代碼文件:package com.example.lista;//Source code location in package //*import needed class definition files import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup;//import class ViewGroup import android.support.v4.view.ViewPager;//import class ViewPager import android.support.v4.view.PagerAdapter;//import class PagerAdapter//*main class public class Todolist extends Activity {private ViewPager myViewPager;//alarm myViewPagerprivate MyPagerAdapter myAdapter;//alarm myAdapter//*main function@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.todolist);myAdapter = new MyPagerAdapter();//instantiate myAdaptermyViewPager=(ViewPager)findViewById(R.id.todolist);//instantiate myViewPagermyViewPager.setAdapter(myAdapter);//set myAdapter to be the adapter of myViewPagermyViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){@Overridepublic void onPageSelected(int position){myViewPager.setCurrentItem(position);}});//define a new class, and set it to be the listener of myViewPager}; }//*define subclass MyPagerAdapter, inherited from class PagerAdapter class MyPagerAdapter extends PagerAdapter{@Override//link every page with a key objectpublic Object instantiateItem(ViewGroup container, int position){LayoutInflater inflater = (LayoutInflater) container.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);int resId=0;switch (position) {case 0:resId = R.layout.todolist;break;case 1:resId = R.layout.donelist;break;}View view = inflater.inflate(resId, null);((ViewPager)container).addView(view);//inflatereturn view;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object){((ViewPager) container).removeView((View) object);}@Overridepublic int getCount() {return 2;}@Overridepublic boolean isViewFromObject(View container, Object object) {return container == ((View) object);} } ViewPager的使用原理如下圖:
軟件界面如下,圖片是可以滑動的,當然這里顯示不出來:
2013.10.5
已學過兩個Listener
OnClickListener.onClick(View view)
OnPageChangeListener.onPageSelected(int position)
OnPagerChangeListener官方釋義
ViewPager官方釋義
LayoutInflater官方釋義
我不能不說viewpager的使用太過繁瑣,一個功能實現需要調用幾個類,這些類還不在一個層次上!
深感于android api的復雜,汽車操作系統一定比android要大的多。
終于把功能實現了,問題出在xml文件里。明天把所有程序貼出來!
2013.10.4
public?Object?instantiateItem?(ViewGroup?container,?int?position) ?
為給定的位置建立頁面。
這里有幾個概念需要明晰:
container,用于顯示page內容的view,即containing view。就是一個控件。
position, page number
page, 頁,即內容
Package com.example.lista;import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup;//import class ViewGroup import android.support.v4.view.ViewPager;//import class ViewPager import android.support.v4.view.PagerAdapter;//import class PagerAdapterpublic class Todolist extends Activity {private ViewPager myViewPager;private MyPagerAdapter myAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.todolist);myAdapter = new MyPagerAdapter();myViewPager=(ViewPager)findViewById(R.id.todolist);myViewPager.setAdapter(myAdapter);myViewPager.setCurrentItem(0);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.todolist, menu);return true;}private class MyPagerAdapter extends PagerAdapter{@Overridepublic Object instantiateItem(ViewGroup container, int position){LayoutInflater inflater = (LayoutInflater) container.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);int resId=0;switch (position) {case 0:resId = R.layout.todolist;break;case 1:resId = R.layout.donelist;break;}View view = inflater.inflate(resId, null);((ViewPager)container).addView(view);return view;}@Overridepublic void destroyItem(ViewGroup container, int position, Object object){((ViewPager) container).removeView((View) object);}@Overridepublic int getCount() {return 2;}@Overridepublic boolean isViewFromObject(View container, Object object) {return container == ((View) object);}} }
此程序尚存在一定問題,可以編譯不能運行。
可能的問題是沒有設置翻頁的觸動方法,這個需要用到ViewPager的子類setOnPageChangeListener。
2013.10.3
看了半天網上的文章,硬是沒看懂幾篇。與書相比,網上前輩們的文章對viewpager的介紹零碎(僅針對自己的特例)、抽象(全是代碼)、不直觀(沒有原理圖),android官網上的介紹全是文字乏味難懂。這些文章和我的文章一樣都是給自己看的,技術詞匯多,像隨筆碎碎念,而不是系統闡述,更不是科普讀物。下面我連蒙帶猜總結下viewpager的原理:
viewpager是一個控件,android學名稱為view。pager顧名思義“翻頁者”。也就是說viewpager是用來翻頁的。翻頁首先要指定區域,翻什么地方的頁?整個頁面,半個頁面還是某個區域。ViewPager的實例化就是指定一個翻頁區域。ViewPager就像一個相框,還需要一個人來更改相框里的內容,這個任務就交給了PagerAdapter。相框內容的產生、更改和消失都是由他負責。
android官網上的例子源碼:點擊打開鏈接
開發java版的lista需要學習J2ME,另外還需要對symbian有一定了解。好消息是symbian對J2ME的支持很好。壞消息是J2ME和symbian都沒落了,symbian據說還對開發者不友好。網上一位10年還在叫囂支持symbian的開發者11年就掉頭轉向了android、ios。技術的沒落的速度真是讓人汗顏啊。我現在就像拾荒的老人試圖在這些被人遺棄的技術堆里找到些值錢的寶貝。
2013.10.2
設置donelist 背景圖片為doneback.png
<LinearLayout?android:background="@drawable/doneback"></LinearLayout>
//background?imagine?is?located?in?folder?drawable,?and?its?name?is?doneback?
類很類似于結構體。聲明類即是建立指針,在棧內存中為其分配一段空間;實例化即是給指針賦值,在堆內存中分配一段空間讓指針指向它。
聲明一個ViewPager類私有對象myViewPager
private?ViewPager?myViewPager;
//myViewPager?is?accessed?within?the?class?of?ViewPager?only
將myViewPager通過ID找View的方法實例化
myViewPager=(ViewPager)findViewById(R.id.todolist);
ViewPager講的比較明白的一個例子
官方viewpager解釋http://developer.android.com/reference/android/support/v4/view/ViewPager.html
?
2013.9.30
Android的 ViewPager 學習筆記
Android ViewPager使用詳解
Android 中的通過 ViewPager 實現左右滑屏
創建任務列表可能會用到這個listview詳解
?
2013.9.29
今天看了看建個人網站的,貌似可以免費自建個人站點。可不可以用這個作為同步的橋梁呢?
2013.9.23
已經學習過的api類庫
| 功能 | 關鍵字或函數 | 所屬包 |
| 活動控制 | activity | android.app.Activity |
| 界面跳轉 | intent | android.content.Intent |
| 界面顯示 | setcontentview | android.view.View |
| 短音頻 | soundpool | android.media.SoundPool,android.media.AudioManager |
| 長音頻 | MediaPlayer | android.media.MediaPlayer |
2013.9.22
java通用版和android版的開發或許有很大不同,兩者提供的api很不一樣。像文明5這么多畫面的游戲的java版只有一點多兆,而我開發的halloya存了幾個圖片就突破4兆了。
另外,android版第一個功能實現:滑動實現界面跳轉,即to do list-->done list。
這需要用到一個類viewpager。
另,觀autosar官網,autosar的核心合作伙伴多為整車廠,零部件商有二:博世和大陸,其他等級的合作伙伴多為零部件商和電子廠商,缺乏專業的軟件廠商,讓我對autosar的未來有一絲擔憂。autosar的api并沒有將與零部件控制的軟件納入,未來控制軟件可以分為與零部件模型相關的驅動和與零部件模型不想關的功能兩塊,前者塞入api,后者作為應用軟件,而不是現在的整個控制軟件作為app。所以未來autosar是不是能延續下去還是個問題。
未來的汽車操作系統不會是iOS和android或其變體,而會是基于某個精小的實時操作系統內核的新操作系統,比如基于QNX內核,具備面向對象和微內核的特點以便于擴展。汽車和手機電腦有較大差別,操作系統一定是新設計的,專為汽車設計的,對于已有的操作系統只能是借鑒而不是照搬。未來的汽車操作系統更多的支持語音、控制和物聯網,而不是顯示。而api這一塊是可以大做文章的,api包含了大量汽車零部件以及整車的模型,整車廠會是這塊的主角。為了研發汽車操作系統,軟件公司收購汽車公司未來也是有可能的。
2013.9.21
該軟件定名為lista,中文名麗塔。在以上羅列出的幾個功能中有兩個功能必不可少,一個是語音錄入,以語音的形式記錄信息,方便我在時間緊張或是不方便打字的情況下快速錄入所想到的信息,以備遺忘。另一個是任務完成自動移出,主界面to do list保持干凈清晰,同時方便回查已完成的任務。
手機自帶的同類軟件多和日歷掛鉤,輸入框多,步驟多,功能多,不方便使用。有很多任務是信息不完整的,比如沒有deadline,沒有起始日期,沒有重要性等級等等。
2013.9.20
今天看了關于塞班的資料,塞班是一款面向對象的操作系統,其內核是微內核,而非傳統內核,這均為其相對于使用linux內核的android系統的優勢。現已沒有多少人為塞班開發應用,但是塞班仍然具有挖掘利用的潛力,我認為。我在我的塞班手機上裝了很多游戲,這些游戲大部分是java軟件,畫面細膩,反應速度尚可,可以說如果我開發一款java版的to do list,應該能有不錯的表現。
總結
以上是生活随笔為你收集整理的java跨平台项目-lisa的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OMA DRM代理安全性思考
- 下一篇: mapi java_Powershell