這是一個簡單的應用程序,實現的功能就是:你填寫一些必要信息,比方說姓名和學號,然後點擊簽到按鈕,就把你的信息收錄數據庫;當然你可以替別人請假,所以設置了請假按鈕;爲了方便查看有那些人已經簽到了或是請假了,你可以查看出勤表,也就是讀取數據庫信息。這就是一個簡單簽到應用。
經過這幾天的學習,對Android有一個大致的瞭解了,但是還是有很多侷限性,所以想到練練手。不過這個程序也寫了很久,從昨晚開始寫,到今天中午才調試完成功能,還是破費心血的,不過,弄出來了,還是值得開心的。
首先說下思路。我做這個出於幾方面考慮,一是要界面設計,二是有多個Activity設計,三是有數據庫的數據存儲。
從這三點來看,也可以看出我的設計思路,也就是按這三步來做的。首先把最基本的兩個layout設計好,把button和edittext和listview弄好,這裏面有一點很特別,就是listview,因爲簽到涉及的到內容比較多,比方說我這裏面就有四點:id,name,code,status。id不用說了,數據庫裏的,大家都懂。name就是保存的姓名內容。code就是保存的學號內容。status就是你是簽到,還是請假這兩個狀態。說到這裏,那麼listview就還要設計一個layout,就是listview的每條都有這四個內容,這四個內容就是簡單的textview組成的,不知道你懂了沒。
界面設計好了,就到Activity了,這裏肯定有兩個Activity的,因爲主界面是簽到那個Activity,然後你的出勤表是第二個Activity,你進入第二個Activity是通過第一個界面上的出勤表button進去的,我也設計了一個back在第二個Activity上,也就是返回第一個界面。當然,其實第一個Activity我還加入了menu功能,就是退出。第二個Activity是關鍵,因爲它是讀取數據庫信息,然後把它顯示出來。
從第二個Activity的onCreate開始,然後就是要對數據庫進行操作了。其實這裏面只有簡單的一些數據庫操作,首先是建立數據庫,直接寫一個類繼承官方提供的SQLiteOpenHelper這個幫助類,然後添加他提供的創建和更新數據庫的方法就可以了。然後是插值,怎麼把你簽到活請假的信息插入到數據庫裏面。首先關鍵是插值,直接用你寫的類創建一個實例,操作方法就是insert,不過有格式,就是用values的方法,把你的每一個都當着string傳給數據庫裏面的每條的變量名下。從這裏,也就可以知道你要怎麼做,也就是你要插入的值都是string,所以你edittext直接獲取,轉化爲string類型,然後通過values插進去就可以了,這裏還有一個status,它是通過你選擇不同的button來插入的,要注意下。至於id的增加,其實很簡單,我這裏就設置了一個私有成員變量number,然後從1開始增加,每插入一條,就讓number增加一次就可以了。
最關鍵的是怎麼把數據庫的每一條讀出來,然後傳給listview,這裏面要用的adapter和list這兩個概念。adapter是適配器,就是你設計一系列的數據鏈,然後通過這個適配器,綁定在listview上,這樣你set這個view就可以看到你的這些數據。操作的時候有要注意的地方,就是我這裏用到的就是常用的SimpleAdapter()操作方法,這個方法有五個參數,第一個是當前上下文,這個很好理解;第二個是layout,其實就是你設計的listview怎麼佈局的,比方說我剛纔說了,我的要顯示四個textview,也就是數據庫的四個變量,所以就把你設計的那個layout.xml名字傳過來就可以了;第三個是一個list,就是數據鏈,這個待會再說;第四個和第五個是配對的,一個是from一個是to,複雜的說就是你讀取你數據庫裏面那些數據,這些數據的名字就放在from這個字符串數組裏面,而to這個int型數組則是你把你從from裏面讀取的數據要放到哪裏去,也就是顯示在哪裏,當然是顯示在listview裏面啦,但是具體在哪裏,當然是textview咯。所以我的賦值是這樣的,應該能懂。
String[] fromColumns = new String[] {"id","name","code","status"};
SimpleAdapter adapter = new SimpleAdapter(Attendance.this,listItem,R.layout.listview,fromColumns,new int[] {R.id.textview01,R.id.textview02,R.id.textview03,R.id.textview04});
在最後說那個list吧。這個list是什麼意思呢?其實它就是一個鏈表,它把我所有要顯示的數據都存在這個表裏面了,然後我直接讀這個表就可以了。可想而知,這個表肯定是從數據庫裏面產生的,的確,那麼它是怎麼從數據庫把數據拷貝到自己的表中呢?其實,我這裏就設計了兩個list,一個是idlist就是隻有id也就是1,2,3、、、之類的,另一個纔是所有數據的list,我讀取每個idlist裏面的值,然後把他傳給這個字符串的list,然後把這個字符串的list傳給adapter就可以顯示出來了。這裏面有一個HashMap<String,Object>要特別說一下,這個就是建立這個字符串list的方法,他第一個變量是key就是我們的id之類的,後面的Object是隨便類型的數據,我這裏都是字符串。
源代碼:
主界面的Activity程序。
package com.example.attendance;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.view.*;
import android.widget.*;
public class MainActivity extends Activity {
private int number=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//簽到按鍵操作
Button qdbutton = (Button)findViewById(R.id.button1);
qdbutton.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//取得edit
EditText evname = (EditText)findViewById(R.id.edit1);
String strname = evname.getText().toString();
EditText evcode = (EditText)findViewById(R.id.edit2);
String strcode = evcode.getText().toString();
//保存信息到數據庫
Mysql mysql = new Mysql(MainActivity.this, "mydb", null, 1);
SQLiteDatabase db = mysql.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("id", number++);
values.put("name", strname);
values.put("code", strcode);
values.put("status", "attend");
db.insert("message", null, values);
db.close();
//顯示簽到成功
Toast.makeText(MainActivity.this, "簽到成功",Toast.LENGTH_SHORT).show();
}});
//請假按鍵操作
Button qjbutton = (Button)findViewById(R.id.button2);
qjbutton.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//取得edit
EditText evname = (EditText)findViewById(R.id.edit1);
String strname = evname.getText().toString();
EditText evcode = (EditText)findViewById(R.id.edit2);
String strcode = evcode.getText().toString();
//保存信息到數據庫
Mysql mysql = new Mysql(MainActivity.this, "mydb", null, 1);
SQLiteDatabase db = mysql.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("id", number++);
values.put("name", strname);
values.put("code", strcode);
values.put("status", "leave");
db.insert("message", null, values);
db.close();
//顯示准許請假
Toast.makeText(MainActivity.this, "准許請假",Toast.LENGTH_SHORT).show();
}});
//顯示按鍵操作
Button xsbutton = (Button)findViewById(R.id.button3);
xsbutton.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//顯示數據庫信息
Intent intent = new Intent();
intent.setClass(MainActivity.this, Attendance.class);
startActivity(intent);
finish();
}});
}
//菜單顯示:退出、關於
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub
if(item.getItemId()==R.id.item1)
{
//退出
finish();
//onDestroy();
}
else if(item.getItemId()==R.id.item2)
{
//彈出對話框
AlertDialog.Builder builder = new AlertDialog.Builder(this);
LayoutInflater li = this.getLayoutInflater();
View view =li.inflate(R.layout.dialog, null);
builder.setTitle("關於");
builder.setIcon(R.drawable.ic_launcher);
builder.setView(view);
builder.setPositiveButton("確定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
dialog.cancel();
}
}).create().show();
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
把數據庫內容顯示在listview這個Activity裏面的代碼。
package com.example.attendance;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
public class Attendance extends ListActivity {
HashMap<String,Object> map;
ArrayList<String> idList = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.attendance);
//顯示數據庫信息
Mysql mysql = new Mysql(Attendance.this, "mydb", null, 1);
SQLiteDatabase db = mysql.getWritableDatabase();
List<HashMap<String,Object>> listItem = new ArrayList<HashMap<String,Object>>();//創建ListView
Cursor cursor = db.rawQuery("select * from message", null);
while(cursor.moveToNext()){ //循環取出cursor中的數據,並判斷下一個下標是否有內容
String id = cursor.getString(cursor.getColumnIndex("id"));//取出cursor中的ID
String name = cursor.getString(cursor.getColumnIndex("name")); //取出cursor中的NAME
String code = cursor.getString(cursor.getColumnIndex("code")); //取出cursor中的CODE
String status = cursor.getString(cursor.getColumnIndex("status"));//取出cursor中的STATUS
idList.add(id);
map = new HashMap<String,Object>();
map.put("id", id);
map.put("name", name);
map.put("code",code);
map.put("status", status);
listItem.add(map);
}
ListView lv = (ListView)findViewById(android.R.id.list);
String[] fromColumns = new String[] {"id","name","code","status"};
SimpleAdapter adapter = new SimpleAdapter(Attendance.this,listItem,R.layout.listview,fromColumns,new int[] {R.id.textview01,R.id.textview02,R.id.textview03,R.id.textview04});
lv.setAdapter(adapter);
cursor.close();
//返回按鍵操作
Button fhbutton = (Button)findViewById(R.id.backbutton);
fhbutton.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(Attendance.this, MainActivity.class);
startActivity(intent);
finish();
}});
}
}
至於創建數據庫那個java文件和一些設計界面的xml文件就步貼了,沒什麼技術含量。
運行效果截圖:
初始進入界面
黃平要簽到,提示簽到成功
查看出勤表,黃平已經在數據庫裏面