Tải bản đầy đủ (.docx) (10 trang)

Xây dựng ứng dụng tra cứu Karaoke

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (442.24 KB, 10 trang )

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 được quy trình xây dựng một ứng dụng hồn chỉnh
- Xây dựng một ứng dụng hoàn chỉnh Tra cứu bài hát Karaoke
II. Nội dung
- Yêu cầu: Xây dựng ứng dụng tra cứu bài hát Karaoke có giao diện như sau:

- Mơ tả: Giao diện gồm có 3 Tab: Tìm kiếm (có thể tìm theo Tên hoặc Mã bài hát), Danh sách bài
hát và Bài hát yêu thích. Khi Click vào một bài hát nào đó, Activity chứa thơng tin chi tiết bài hát
đó sẽ được gọi, có giao diện như sau:

- Các bước thực hiện:
Bước 1: Copy các hình ảnh cần thiết cho Project vào thư mục Drawable


Bước 2: Copy cơ sở dữ liệu arrirang.sqlite vào thư mục assets
Bước 3: Xây dựng giao diện cho MainActivity trong file activity_main.xml, tham khảo cây
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 là subactivity.xml

Bước 6: Xây dựng Class Item.class chứa các đối tượng trong từng dòng của 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 là myarrayAdapter
public class myarrayAdapter extends ArrayAdapter<Item> {
Activity context = null;
ArrayList<Item>myArray =
null; int LayoutId;
public myarrayAdapter(Activity context, int LayoutId,ArrayList<Item>arr) {
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 và 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 hiện btnlike
}
// Xử lý sự kiện khi click vào ImageButton btnlike và 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ý sự kiện khi Click vào mỗi dòng tiều đề bài hát trên Listview
//Chuyển Textview tieude và maso sang màu đỏ
//Khai báo Intent, Bundle,lấy maso truyền qua subactivity và 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 dữ liệu khỏi
Bundle Intent callerIntent1 =

getIntent();
Bundle backagecaller1 = callerIntent1.getBundleExtra("package");
String maso = backagecaller1.getString("maso");
//Truy vấn dữ liệu từ maso nhận được; Hiển thị dữ liệu Mã bài hát, Tên bài hát, Lời bà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ý sự kiện khi click vào Button btnthich và btnkhongthich
//Cập nhật dữ liệu vào CSDL, thay đổi trạng thái hiển thị cho Button btnthich và
//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<Item> 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ở dữ liệu đã copy. Lưu vào biến database
database = openOrCreateDatabase("arirang.sqlite", MODE_PRIVATE,
null); addControl(); //Hàm thêm các Controls
addTim();
//Xử lý công việc tìm kiếm
addEvents(); //Xử lý sự kiện khi chuyển Tab và các sự kiện khác
}
//Hàm khai báo và Add các Controls vào giao diện
//Trên 3 Tab chúng ta có 3 ListView ứng với 3 Danh sách dữ liệu (Dữ liệu tìm
kiếm, Danh
//sách bài hát gốc, Danh sách bài hát yêu thích) và 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<Item>();
list2 =new
ArrayList<Item>(); list3
=new ArrayList<Item>();
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ý sự kiện khi chuyển qua lại giữa các Tab Danh sách và 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 khi Click vào Button xóa trên 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 bài hát vào Listview trên 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 bài hát vào Listview trên Tab Danh sách bài
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 bài hát theo Tiêu đề và Mã số
private void addTim() {

// TODO Auto-generated method stub
//Sự kiện khi Thay đổi Text trong 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 dữ 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 các tham số trong file AndroidManifest.xml

Bước 11: Tạo máy ảo và chạy chương trình
End



×