做這個之初是因為女朋友老是忘了自己的很多賬號,所以就萌生了一個給他做一個android應用的想法,用了5天吧 ,實現了基本功能,賬號添加 刪除 修改 都是基於sqlite數據庫的。程序很一般,拿出來和大家分享下。牛人就不用看了,新手還是值得學習的!
總共有四個activity:下面這個是顯示賬號列表的
package com.example.passwordbox; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import database.DBAdapter; import database.goods; import ImageAdapter.listAdapter; import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.app.ListActivity; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.util.Log; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.MenuItem.OnMenuItemClickListener; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnCreateContextMenuListener; import android.view.Window; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.TextView; import android.widget.Toast; public class AccountlistActivity extends Activity implements OnItemClickListener ,OnMenuItemClickListener{ Button btn1=null; Button btn2=null; private ListView listview; DBAdapter db=null; @SuppressWarnings("rawtypes") List list=null; goods good = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.accountlist); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar); //titlebar為自己標題欄的布局 listview=(ListView)findViewById(R.id.list); db = new DBAdapter(this); db.open(); btn1=(Button)findViewById(R.id.buttonn); btn1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { Intent intent1=new Intent(); intent1.setClass(AccountlistActivity.this, NewActivity.class); startActivity(intent1); AccountlistActivity.this.finish(); } }); btn2=(Button)findViewById(R.id.buttonm); btn2.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { Intent intent2=new Intent(); intent2.setClass(AccountlistActivity.this, NewActivity.class); startActivity(intent2); AccountlistActivity.this.finish(); } }); listview.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){ @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { // TODO Auto-generated method stub menu.setHeaderTitle("請選擇操作"); menu.add(0, 0, 0, "刪除"); menu.add(0, 1, 0, "修改"); } }); show(); } //長按菜單響應函數 @Override public boolean onContextItemSelected(MenuItem item) { //setTitle("點擊了長按菜單里面的第"+item.getItemId()+"個項目"); final AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item .getMenuInfo(); int id = (int)info.id;//這里的info.id對應的是item對應的值 if(item.getItemId()==0) { //根據id刪除 db.open(); //int id = (int)info.id;//這里的info.id對應的是item對應的值 showall(); int m=((goods)list.get(id)).getId(); Log.i("刪除ID值", ""+id); // moveToPosition(id) // db.deleteTitle(id); db.deleteTitle(m); db.close(); Toast.makeText(getApplicationContext(), "刪除成功", Toast.LENGTH_SHORT).show(); show(); } else { //根據id LayoutInflater factory = LayoutInflater.from(this); final View textEntryView = factory.inflate(R.layout.reserve, null); final EditText editTextName = (EditText) textEntryView.findViewById(R.id.editTextName); final EditText editTextNumEditText = (EditText)textEntryView.findViewById(R.id.editTextNum); final EditText editTextaccEditText = (EditText)textEntryView.findViewById(R.id.edit); AlertDialog.Builder ad1 = new AlertDialog.Builder(AccountlistActivity.this); ad1.setTitle("修改賬戶及密碼:"); ad1.setIcon(android.R.drawable.ic_dialog_info); ad1.setView(textEntryView); db.open(); // int id = (int)info.id;//這里的info.id對應的就是item的行號 showall(); editTextaccEditText.setText(((goods)list.get(id)).getName()); editTextName.setText(((goods)list.get(id)).getAccount()); editTextNumEditText.setText(((goods)list.get(id)).getPass()); Log.i("修改賬號", ""+((goods)list.get(id)).getAccount()); ad1.setPositiveButton("是", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int i) { Log.i("111111", editTextName.getText().toString()); int id = (int)info.id; String name=editTextaccEditText.getText().toString(); String account=editTextName.getText().toString(); String pass=editTextNumEditText.getText().toString(); Log.i("修改ID值", ""+id); int m=((goods)list.get(id)).getId(); //Log.i("刪除ID值", ""+id); db.updateTitle(m, name,account, pass); db.close(); show(); Toast.makeText(getApplicationContext(), "修改成功", Toast.LENGTH_SHORT).show(); } }); ad1.setNegativeButton("否", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int i) { } }); ad1.show();// 顯示對話框 } return super.onContextItemSelected(item); } // protected void showAddDialog() { // // // // } @SuppressWarnings({ "unchecked", "rawtypes" }) public void show() { db.open(); showall(); Log.i("查詢結果", "內容"+list.toString()); listAdapter adapter = new listAdapter(this.getApplicationContext(), list); db.close(); listview.setAdapter(adapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.accountlist, menu); return true; } @Override //id被點擊元素的行id //視圖在adapter中的位置 //在AdapterView中被點擊的視圖(它是由adapter提供的一個視圖) public void onItemClick(AdapterView<?> AdapterViewparent, View view, int position, long id) { // TODO Auto-generated method stub if(id<-1) { // 點擊的是headerView或者footerView return; } int realPosition=(int)id; // T item=getItem(realPosition); // 響應代碼 } public List showall() { list=new ArrayList(); Cursor cur=db.getAllTitles(); if(cur==null) { Log.i("查詢結果", "weikong"); } for(cur.moveToFirst();!cur.isAfterLast();cur.moveToNext()) { good=new goods();//必須每次new一個對象 才能使得list add()不斷添加 int idColumn=cur.getColumnIndex("_id"); int nameColumn = cur.getColumnIndex("name"); int accColumn = cur.getColumnIndex("account"); int phoneColumn = cur.getColumnIndex("pass"); String name = cur.getString(nameColumn); String pass = cur.getString(phoneColumn); String account=cur.getString(accColumn); String id=cur.getString(idColumn); good.setId((int)Integer.parseInt(id)); good.setName(name); good.setAccount(account); good.setPass(pass); Log.i("查詢結果", "weikong"+good.getName()); list.add(good); } return list; } @Override public boolean onMenuItemClick(MenuItem arg0) { // TODO Auto-generated method stub return false; } }
下面這個是程序啟動頁面:
package com.example.passwordbox; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.content.Intent; import android.view.Menu; import android.view.Window; import android.view.WindowManager; public class RunActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.run); new Handler().postDelayed(new Runnable(){ public void run() { RedirectNewActivity(); } }, 2000); } public void RedirectNewActivity() { Intent intent=new Intent(); intent.setClass(RunActivity.this, NewActivity.class); startActivity(intent); RunActivity.this.finish(); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.run, menu); return true; } }
下面這個是進去程序后的主頁面:
package com.example.passwordbox; import ImageAdapter.imageAdapter; import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.res.Resources; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.GridView; import android.widget.ImageButton; public class NewActivity extends Activity implements OnItemClickListener, OnClickListener{ private Resources resMgr = null; Button bt1=null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.news); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar); //titlebar為自己標題欄的布局 resMgr=getResources(); bt1=(Button)findViewById(R.id.buttonn); bt1.setOnClickListener(this); GridView gridView = (GridView) findViewById(R.id.gridView1); String strContent[] = { resMgr.getString(R.string.add), resMgr.getString(R.string.show), }; gridView.setAdapter(new imageAdapter(this, strContent)); gridView.setOnItemClickListener(this); } private void close() { new AlertDialog.Builder(this) // .setIcon(R.drawable.services) .setTitle(R.string.MAINACTIVITY_POPUP_QUIT_TITLE) .setMessage(R.string.MAINACTIVITY_POPUP_QUIT_MESSAGE) .setNegativeButton(R.string.MAINACTIVITY_POPUP_QUIT_CANCEL, new DialogInterface.OnClickListener() { // @Override public void onClick(DialogInterface dialog, int which) { } }) .setPositiveButton(R.string.MAINACTIVITY_POPUP_QUIT_OK, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { finish(); //System.exit(0); } }).show(); } /* * (non-Javadoc) * * @see android.app.Activity#dispatchKeyEvent(android.view.KeyEvent) */ @Override public boolean dispatchKeyEvent(KeyEvent event) { // TODO Auto-generated method stub if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) { if (event.getAction() == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) { close();// 這是自定義的代碼 } return true; } return super.dispatchKeyEvent(event); } @Override public boolean onCreateOptionsMenu(Menu menu){ super.onCreateOptionsMenu(menu); menu.add(0,0,0,"設置");//第二個參數是menu的id,第4個參數是菜單顯示的內容,其余的不重要。 menu.add(0,1,0,"關於"); menu.add(0,2,0,"退出"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item){ super.onOptionsItemSelected(item); switch(item.getItemId()) { case 0: break; case 1: new AlertDialog.Builder(this) .setTitle("關於") .setMessage("本軟件為愛心制作") .setPositiveButton("確定", null) .show(); break; case 2: this.finish(); break; } return true; } @Override public void onItemClick(AdapterView<?> parent, View v, int position, long arg3) { // TODO Auto-generated method stub switch(position){ case 0: { Intent intent1=new Intent(); intent1.setClass(NewActivity.this, AddaccountActivity.class); startActivity(intent1); NewActivity.this.finish(); break; } case 1: { Intent intent2=new Intent(); intent2.setClass(NewActivity.this, AccountlistActivity.class); startActivity(intent2); NewActivity.this.finish(); break; } } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if (keyCode == KeyEvent.KEYCODE_BACK) { close(); return true; } else { return super.onKeyDown(keyCode, event); } } @Override public void onClick(View v) { // TODO Auto-generated method stub close(); } }
下面這個是添加賬號信息的activity:
package com.example.passwordbox; import database.DBAdapter; import android.os.Bundle; import android.app.Activity; import android.app.AlertDialog; import android.content.Intent; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.Window; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class AddaccountActivity extends Activity { private Button btt1=null; private Button btt2=null; private Button btt3=null; EditText tx1=null; EditText tx2=null; EditText tx3=null; DBAdapter db=null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.addaccount); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.titlebar); //titlebar為自己標題欄的布局 db = new DBAdapter(this); tx1=(EditText)findViewById(R.id.editText1); tx2=(EditText)findViewById(R.id.editText2); tx3=(EditText)findViewById(R.id.editTextacc); btt1=(Button)findViewById(R.id.buttonn); btt1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { Intent intent1=new Intent(); intent1.setClass(AddaccountActivity.this, NewActivity.class); startActivity(intent1); AddaccountActivity.this.finish(); } }); btt2=(Button)findViewById(R.id.buttonm); btt2.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) { Intent intent2=new Intent(); intent2.setClass(AddaccountActivity.this, NewActivity.class); startActivity(intent2); AddaccountActivity.this.finish(); } }); btt3=(Button)findViewById(R.id.button10); btt3.setOnClickListener(new Button.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub if(tx1.getText().length()!=0||tx1.getText().length()!=0) { db.open(); long id=db.insertTitle(tx1.getText().toString(),tx3.getText().toString(), tx2.getText().toString()); Log.i("插入結果", "id"+id); db.close(); Intent intent2=new Intent(); intent2.setClass(AddaccountActivity.this, AccountlistActivity.class); startActivity(intent2); AddaccountActivity.this.finish(); } else { new AlertDialog.Builder(AddaccountActivity.this).setMessage("本框不能為空!").setPositiveButton("確定", null).show(); } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.addaccount, menu); return true; } }
實體類:
package database; public class goods { private int id; private String name; private String account; private String pass; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } }
數據庫操作類:
package database; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteCursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; //庫表中兩個字段AppName AppPass public class DBAdapter { public static final String KEY_ROWID = "_id"; public static final String AppName="name"; public static final String AppAccount="account"; public static final String AppPass="pass"; private static final String TAG = "DBAdapter"; private static final String DATABASE_NAME = "BOX"; private static final String DATABASE_TABLE = "yuyu"; private static final int DATABASE_VERSION = 1; private static final String DATABASE_CREATE = "create table yuyu (_id integer primary key autoincrement, " + "name text not null,account text not null, pass text not null);"; private final Context context; private DatabaseHelper DBHelper; private SQLiteDatabase db; public DBAdapter(Context ctx) { this.context = ctx; DBHelper = new DatabaseHelper(context); } private static class DatabaseHelper extends SQLiteOpenHelper { DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } //創建一個新的數據庫 public void onCreate(SQLiteDatabase db) { db.execSQL(DATABASE_CREATE); } //升級數據庫 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data"); db.execSQL("DROP TABLE IF EXISTS titles"); onCreate(db); } } //---打開數據庫--- public DBAdapter open() throws SQLException { db = DBHelper.getWritableDatabase(); return this; } //---關閉數據庫--- public void close() { DBHelper.close(); } //---向數據庫插入一個標題--- public long insertTitle(String name,String account ,String pass) { ContentValues initialValues = new ContentValues(); //initialValues.put(KEY_ROWID, _id); initialValues.put(AppName, name); initialValues.put(AppAccount, account); initialValues.put(AppPass, pass); return db.insert(DATABASE_TABLE, null, initialValues); } //---刪除一個指定的標題--- public boolean deleteTitle(long rowId) { return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; } //---檢索所有標題--- public Cursor getAllTitles() { return db.query(DATABASE_TABLE, new String[] {KEY_ROWID,AppName,AppAccount,AppPass},null,null,null,null,null); } //---檢索一個指定的標題--- public Cursor getTitle(long rowId) throws SQLException { Cursor mCursor = db.query(true, DATABASE_TABLE, new String[] { KEY_ROWID, AppName, AppAccount, AppPass }, KEY_ROWID + "=" + rowId, null, null, null, null, null); if (mCursor != null) { mCursor.moveToFirst(); } return mCursor; } //---更新一個標題--- public boolean updateTitle(long rowId, String name,String account, String pass) { ContentValues args = new ContentValues(); args.put(AppName, name); args.put(AppAccount, account); args.put(AppPass, pass); return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; } }
主頁面上兩個圖標的適配類:
package ImageAdapter; import com.example.passwordbox.R; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class imageAdapter extends BaseAdapter { private Integer[] arrImage = { R.drawable.epurse, R.drawable.ecard, }; String arrText[] = null;// {"登錄", "充值", "消費", "查詢余額", "歷史記錄", "設置", "關於", // "幫助","退出"}; private Context mContext; public imageAdapter(Context context, String[] arrText) { mContext = context; this.arrText = arrText; } public int getCount() { return arrImage.length; } /* * (non-Javadoc) * * @see android.widget.Adapter#getView(int, android.view.View, * android.view.ViewGroup) */ @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub ViewHolder holder = new ViewHolder(); if (convertView == null) { LayoutInflater mInflater = LayoutInflater.from(mContext); convertView = mInflater.inflate(R.layout.item, null); holder.image = (ImageView) convertView.findViewById(R.id.ItemImage); holder.text = (TextView) convertView.findViewById(R.id.ItemText); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag();// imageview=(ImageView) // convertView; } holder.image.setImageResource(arrImage[position]); holder.text.setText(arrText[position]); return convertView; } public Object getItem(int position) { // TODO Auto-generated method stub return null; } public long getItemId(int position) { // TODO Auto-generated method stub return 0; } private static class ViewHolder { ImageView image;// 圖片 TextView text;// 文字 } }
list列表的適配類:
package ImageAdapter; import java.util.List; import com.example.passwordbox.R; import database.goods; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; public class listAdapter extends BaseAdapter{ private List<goods> list;//綁定的數據集 //private int source;//資源布局文件 Context mContext; private LayoutInflater inflater; //布局填充器,Android的內置服務,作用:使用xml文件來生成對應的view對象 public listAdapter (Context context,List<goods> good)//int resource { this.list=good; //this.source=resource; this.mContext=context; //得到布局填充服務 inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { // TODO Auto-generated method stub return list.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return list.get(arg0); } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return arg0; } @Override public View getView(int position, View convertView, ViewGroup arg2) { // TODO Auto-generated method stub //判斷是否為第一頁 //提供緩存機制 ViewCache cache; if(convertView == null){ //為條目創建View對象,生成條目界面對象 convertView = inflater.inflate(R.layout.txview, null); //得到當前條目的數據 cache = new ViewCache(); cache .name = (TextView)convertView.findViewById(R.id.textView5); cache .account = (TextView)convertView.findViewById(R.id.textView6); cache.pass = (TextView)convertView.findViewById(R.id.textView7); //用視圖標識臨時存放緩存數據 // convertView.setTag(cache); } else { cache = (ViewCache) convertView.getTag(); } //得到當前條目對象 goods stu=new goods(); stu = list.get(position); Log.i("list內容", ""+list.toString()); //為當前條目賦值 cache.name.setText(" "+stu.getName().toString()+" "); cache.account.setText(" "+stu.getAccount());//轉化成string cache.pass.setText(" "+stu.getPass().toString()); convertView.setTag(cache); return convertView; } private final class ViewCache { public TextView name; public TextView account; public TextView pass; } }
具體的layout有好幾個 不在這貼了,想要的同學可以找我,我發給你 我的qq:405356078 加的時候注明博客園 否則不加