鉴于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库,
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 definition
JlisaPC() {
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 action
public 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 function
public 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 folder
m.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 stub
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();
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 block
e.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 block
e.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 stub
if (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的这种跨平台特性是不足够的。
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 stub
if (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 stub
if (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();
}
}
}
}
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 stub
FileConnection 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 stub
if (c.getCommandType() == Command.EXIT)
notifyDestroyed();
}
}
实际效果:
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 stub
super ();
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
终于有时间重新开启这个项目了,慢慢走上正轨!
参考案例:
2013.10.19
list的实现方法较多,先尝试ListActivity
目标:在todolist页制成以原画面为背景的列表,暂不考虑滑动删除、排序和编辑功能。
作为测试设备的安卓平板坏了,模拟器速度太慢成为一大问题。发现intel XDK有点意思,HTML5能完成java未实现的愿望吗?
另,开始学习j2me,貌似可以不装诺基亚的开发软件,不用模拟器,用eclipse就行了。测试设备就用我的手机。
2013.10.7
需求定义:
- 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 myViewPager
private MyPagerAdapter myAdapter;//alarm myAdapter
//*main function
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.todolist);
myAdapter = new MyPagerAdapter();//instantiate myAdapter
myViewPager=(ViewPager)findViewById(R.id.todolist);//instantiate myViewPager
myViewPager.setAdapter(myAdapter);//set myAdapter to be the adapter of myViewPager
myViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
@Override
public 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 object
public 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);//inflate
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object){
((ViewPager) container).removeView((View) object);
}
@Override
public int getCount() {
return 2;
}
@Override
public boolean isViewFromObject(View container, Object object) {
return container == ((View) object);
}
}
2013.10.5
已学过两个Listener
OnClickListener.onClick(View view)
OnPageChangeListener.onPageSelected(int position)
我不能不说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 PagerAdapter
public class Todolist extends Activity {
private ViewPager myViewPager;
private MyPagerAdapter myAdapter;
@Override
protected 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);
}
@Override
public 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{
@Override
public 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;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object){
((ViewPager) container).removeView((View) object);
}
@Override
public int getCount() {
return 2;
}
@Override
public 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解释http://developer.android.com/reference/android/support/v4/view/ViewPager.html
2013.9.30
创建任务列表可能会用到这个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,应该能有不错的表现。