簽到app--Android練手

       這是一個簡單的應用程序,實現的功能就是:你填寫一些必要信息,比方說姓名和學號,然後點擊簽到按鈕,就把你的信息收錄數據庫;當然你可以替別人請假,所以設置了請假按鈕;爲了方便查看有那些人已經簽到了或是請假了,你可以查看出勤表,也就是讀取數據庫信息。這就是一個簡單簽到應用。

       經過這幾天的學習,對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文件就步貼了,沒什麼技術含量。

       

        運行效果截圖:

初始進入界面

黃平要簽到,提示簽到成功

查看出勤表,黃平已經在數據庫裏面





發佈了37 篇原創文章 · 獲贊 14 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章