Thực hành xây dựng ứng dụng XÂY DỰNG ỨNG DỤNG TRA CỨU BÀI HÁT KARAOKEI.Mục tiêuGiúp sinh viên hiểu được quy trình xây dựng một ứng dụng hoàn chỉnhXây dựng một ứng dụng hoàn chỉnh Tra cứu bài hát Karaoke
BÀI 14 PROJECT TỔNG HỢP - XÂY DỰNG ỨNG DỤNG TRA CỨU BÀI HÁT KARAOKE I Mục tiêu - Giúp sinh viên hiểu quy trình xây dựng ứng dụng hoàn chỉnh - Xây dựng ứng dụng hoàn chỉnh Tra cứu hát Karaoke II Nội dung - Yêu cầu: Xây dựng ứng dụng tra cứu hát Karaoke có giao diện sau: - Mơ tả: Giao diện gồm có Tab: Tìm kiếm (có thể tìm theo Tên Mã hát), Danh sách hát Bài hát yêu thích Khi Click vào hát đó, Activity chứa thơng tin chi tiết hát gọi, có giao diện sau: - Các bước thực hiện: Bước 1: Copy hình ảnh cần thiết cho Project vào thư mục Drawable Bước 2: Copy sở liệu arrirang.sqlite vào thư mục assets Bước 3: Xây dựng giao diện cho MainActivity file activity_main.xml, tham khảo Outline Bước 4: Xây dựng tài nguyên Layout phục vụ cho costumListView: tạo file Layout mới, đặt tên listitem.xml Bước 5: Xây dựng giao diện cho Activity activitysub đặt tên subactivity.xml Bước 6: Xây dựng Class Item.class chứa đối tượng dòng ListView : public class Item { private String maso,tieude; private Integer thich; public Item() { } public Item(String maso, String tieude, Integer thich) { this.maso = maso; this.tieude = tieude; this.thich = thich; } /** * @return the tieude */ public String getTieude() { return tieude; } /** * @param tieude the tieude to set */ public void setTieude(String tieude) { this.tieude = tieude; } /** * @return the maso */ public String getMaso() { return maso; } /** * @param maso the maso to set */ public void setMaso(String maso) { this.maso = maso; } /** * @return the thich */ public Integer getThich() { return thich; } /** * @param thich the thich to set */ public void setThich(Integer thich) { this.thich = thich; } } Bước 7: Xây dựng Class Costum Adapter đặt tên myarrayAdapter public class myarrayAdapter extends ArrayAdapter { Activity context = null; ArrayListmyArray = null; int LayoutId; public myarrayAdapter(Activity context, int LayoutId,ArrayListarr) { super(context, LayoutId,arr); // TODO Auto-generated constructor stub this.context = context; this.LayoutId = LayoutId; this.myArray = arr; } @Override public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stub LayoutInflater inflater = context.getLayoutInflater(); convertView = inflater.inflate(LayoutId, null); final Item myItem = myArray.get(position); final TextView tieude = (TextView)convertView.findViewById(R.id.txttieude); tieude.setText(myItem.getTieude()); final TextView maso =(TextView)convertView.findViewById(R.id.txtmaso); maso.setText(myItem.getMaso()); final ImageView btnlike = (ImageView)convertView.findViewById(R.id.btnlike); final ImageView btnunlike = (ImageView)convertView.findViewById(R.id.btnunlike); int thich = myItem.getThich(); //Xử lý hiển thị cho ImageButton btnlike btnunlike if (thich==0) { btnlike.setVisibility(View.INVISIBLE); //cho ẩn btnlike btnunlike.setVisibility(View.VISIBLE); //cho hiển thị btnunlike } else { btnunlike.setVisibility(View.INVISIBLE); //cho ẩn btnunlike btnlike.setVisibility(View.VISIBLE); //cho btnlike } // Xử lý kiện click vào ImageButton btnlike btnunlike // Cập nhật trạng thái thich vào CSDL; Thiết lập ImageButton cho phù hợp btnlike.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { ContentValues values = new ContentValues(); values.put("YEUTHICH", 0); MainActivity.database.update("ArirangSongList", values, "MABH=?", new String[]{maso.getText().toString()}); btnlike.setVisibility(View.INVISIBLE); btnunlike.setVisibility(View.VISIBLE); } }); btnunlike.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { ContentValues values = new ContentValues(); values.put("YEUTHICH", 1); MainActivity.database.update("ArirangSongList", values, "MABH=?", new String[]{maso.getText().toString()}); btnunlike.setVisibility(View.INVISIBLE); btnlike.setVisibility(View.VISIBLE); } }); //Xử lý kiện Click vào dòng tiều đề hát Listview //Chuyển Textview tieude maso sang màu đỏ //Khai báo Intent, Bundle,lấy maso truyền qua subactivity gọi activitysub (activitysub xây dựng bước sau) tieude.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub tieude.setTextColor(Color.RED); maso.setTextColor(Color.RED); Intent intent1 = new Intent(context,activitysub.class); Bundle bundle1 = new Bundle(); bundle1.putString("maso", maso.getText().toString()); intent1.putExtra("package", bundle1); context.startActivity(intent1); } }); return convertView; } } Bước 8: Xây dựng Class activitysub.class //Trong android stu sửa thành public class activitysub extends Activity{ //extends AppCompatActivity TextView txtmaso,txtbaihat,txtloibaihat,txttacgia; ImageButton btnthich,btnkhongthich; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.subactivity); txtmaso =(TextView)findViewById(R.id.txtmaso); txtbaihat =(TextView)findViewById(R.id.txtbaihat); txtloibaihat =(TextView) findViewById(R.id.txtloibaihat); txttacgia =(TextView)findViewById(R.id.txttacgia); btnthich =(ImageButton)findViewById(R.id.btnthich); btnkhongthich = (ImageButton) findViewById(R.id.btnkhongthich); //Nhận Intent từ myarrayAdapter, lấy liệu khỏi Bundle Intent callerIntent1 = getIntent(); Bundle backagecaller1 = callerIntent1.getBundleExtra("package"); String maso = backagecaller1.getString("maso"); //Truy vấn liệu từ maso nhận được; Hiển thị liệu Mã hát, Tên hát, Lời //hát, Tác giả, Trạng thái Thích lên activitysub Cursor c = MainActivity.database.rawQuery("SELECT * FROM ArirangSongList WHERE MABH LIKE'"+maso+"'", null); txtmaso.setText(maso); c.moveToFirst(); txtbaihat.setText(c.getString(2)); txtloibaihat.setText(c.getString(3)); txttacgia.setText(c.getString(4)); if (c.getInt(6)==0) { btnthich.setVisibility(View.INVISIBLE); btnkhongthich.setVisibility(View.VISIBLE); } else { btnkhongthich.setVisibility(View.INVISIBLE); btnthich.setVisibility(View.VISIBLE); } c.close(); //Xử lý kiện click vào Button btnthich btnkhongthich //Cập nhật liệu vào CSDL, thay đổi trạng thái hiển thị cho Button btnthich //btnkhongthich btnthich.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { ContentValues values = new ContentValues(); values.put("YEUTHICH", 0); MainActivity.database.update("ArirangSongList", values, "MABH=?", new String[]{txtmaso.getText().toString()}); btnthich.setVisibility(View.INVISIBLE); btnkhongthich.setVisibility(View.VISIBLE); } }); btnkhongthich.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { ContentValues values = new ContentValues(); values.put("YEUTHICH", 1); MainActivity.database.update("ArirangSongList", values, "MABH=?", new String[]{txtmaso.getText().toString()}); btnkhongthich.setVisibility(View.INVISIBLE); btnthich.setVisibility(View.VISIBLE); } }); } } Bước 9: Xây dựng Class Mainactivity public class MainActivity extends AppCompatActivity { String DB_PATH_SUFFIX = "/databases/"; public static SQLiteDatabase database=null; public static String DATABASE_NAME="arirang.sqlite"; EditText edttim; ListView lv1,lv2,lv3; ArrayList list1, list2, list3; myarrayAdapter myarray1, myarray2, myarray3; TabHost tab; ImageButton btnxoa; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); processCopy(); //Copy CSDL arirang.sqlite //Mở cở sở liệu copy Lưu vào biến database database = openOrCreateDatabase("arirang.sqlite", MODE_PRIVATE, null); addControl(); //Hàm thêm Controls addTim(); //Xử lý cơng việc tìm kiếm addEvents(); //Xử lý kiện chuyển Tab kiện khác } //Hàm khai báo Add Controls vào giao diện //Trên Tab có ListView ứng với Danh sách liệu (Dữ liệu tìm kiếm, Danh //sách hát gốc, Danh sách hát yêu thích) Adapter riêng private void addControl() { // TODO Auto-generated method stub btnxoa =(ImageButton) findViewById(R.id.btnxoa); tab=(TabHost)findViewById(R.id.tabhost); tab.setup(); TabHost.TabSpec tab1=tab.newTabSpec("t1"); tab1.setContent(R.id.tab1); tab1.setIndicator("",getResources().getDrawable(R.drawable.search)); tab.addTab(tab1); TabHost.TabSpec tab2=tab.newTabSpec("t2"); tab2.setContent(R.id.tab2); tab2.setIndicator("",getResources().getDrawable(R.drawable.list)); tab.addTab(tab2); TabHost.TabSpec tab3=tab.newTabSpec("t3"); tab3.setContent(R.id.tab3); tab3.setIndicator("",getResources().getDrawable(R.drawable.favourite)); tab.addTab(tab3); edttim =(EditText) findViewById(R.id.edttim); lv1 = (ListView) findViewById(R.id.lv1); lv2 =(ListView) findViewById(R.id.lv2); lv3 = (ListView) findViewById(R.id.lv3); list1 =new ArrayList(); list2 =new ArrayList(); list3 =new ArrayList(); myarray1 = new myarrayAdapter(MainActivity.this, R.layout.listitem, list1); myarray2 = new myarrayAdapter(MainActivity.this, R.layout.listitem, list2); myarray3 = new myarrayAdapter(MainActivity.this, R.layout.listitem, list3); lv1.setAdapter(myarray1); lv2.setAdapter(myarray2); lv3.setAdapter(myarray3); } //Xử lý kiện chuyển qua lại Tab Danh sách Yêu Thích private void addEvents() { // TODO Auto-generated method stub tab.setOnTabChangedListener(new OnTabChangeListener() { @Override public void onTabChanged(String tabId) { // TODO Auto-generated method stub if (tabId.equalsIgnoreCase("t2")) { addDanhsach(); } if (tabId.equalsIgnoreCase("t3")) { addYeuthich(); } } }); // Sự kiện Click vào Button xóa Tab Tìm kiếm btnxoa.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub edttim.setText(""); } }); } //Hàm thêm hát vào Listview Tab Yêu thích private void addYeuthich() { // TODO Auto-generated method stub myarray3.clear(); Cursor c = database.rawQuery("SELECT * FROM ArirangSongList WHERE YEUTHICH = 1", null); c.moveToFirst(); while(c.isAfterLast()==false) { list3.add(new Item(c.getString(1),c.getString(2),c.getInt(6))); c.moveToNext(); } c.close(); myarray3.notifyDataSetChanged(); } // Hàm thêm hát vào Listview Tab Danh sách hát private void addDanhsach() { // TODO Auto-generated method stub myarray2.clear(); Cursor c = database.rawQuery("SELECT * FROM ArirangSongList", null); c.moveToFirst(); while(c.isAfterLast()==false) { list2.add(new Item(c.getString(1),c.getString(2),c.getInt(6))); c.moveToNext(); } c.close(); myarray2.notifyDataSetChanged(); } //Hàm xử lý tìm kiếm hát theo Tiêu đề Mã số private void addTim() { // TODO Auto-generated method stub //Sự kiện Thay đổi Text Edittext edttim edttim.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { getdata(); } private void getdata() { // TODO Auto-generated method stub String dulieunhap =edttim.getText().toString(); myarray1.clear(); if (!edttim.getText().toString().equals("")) { Cursor c = database.rawQuery("SELECT * FROM ArirangSongList WHERE TENBH1 LIKE '"+"%"+dulieunhap+"%"+"' OR MABH LIKE '"+"%"+dulieunhap+"%"+"'", null); c.moveToFirst(); while(c.isAfterLast()==false) { list1.add(new Item(c.getString(1),c.getString(2),c.getInt(6))); c.moveToNext(); } c.close(); } myarray1.notifyDataSetChanged(); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } }); } //Hàm xử lý Copy CS liệu từ thư mục assets vào hệ thống thư mục cài đặt private void processCopy() { //private app File dbFile = getDatabasePath(DATABASE_NAME); if (!dbFile.exists()) { try{CopyDataBaseFromAsset(); Toast.makeText(this, "Copying sucess from Assets folder", Toast.LENGTH_LONG).show(); } catch (Exception e){ Toast.makeText(this, e.toString(), Toast.LENGTH_LONG).show(); } } } private String getDatabasePath() { return getApplicationInfo().dataDir + DB_PATH_SUFFIX+ DATABASE_NAME; } public void CopyDataBaseFromAsset() { // TODO Auto-generated method stub try { InputStream myInput; myInput = getAssets().open(DATABASE_NAME); // Path to the just created empty db String outFileName = getDatabasePath(); //if the path doesn't exist first, create it File f = new File(getApplicationInfo().dataDir + DB_PATH_SUFFIX); if (!f.exists()) f.mkdir(); //Open the empty db as the output stream OutputStream myOutput = new FileOutputStream(outFileName); //transfer bytes from the inputfile to the outputfile byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } //Close the streams myOutput.flush(); myOutput.close(); myInput.close(); } } catch (IOException e) { //TODO Auto-generated catch block e.printStackTrace(); } } Bước 10: Khai báo tham số file AndroidManifest.xml Bước 11: Tạo máy ảo chạy chương trình End