签到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文件就步贴了,没什么技术含量。

       

        运行效果截图:

初始进入界面

黄平要签到,提示签到成功

查看出勤表,黄平已经在数据库里面





  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值